IMAPを使用してメールを送信するにはどうすればよいですか?
質問
IMAPでGmailにアクセスし、携帯電話用の軽量Gmailクライアントを開発しています。下書きフォルダから下書きを送信したいのですが、添付ファイルがいくつかあり、SMTPで送信するためにすべてをダウンロードすることはできません。
「送信済みメール」への移動/コピー送信せず、単にそのフォルダに移動します。
クライアントからすべてのコンテンツと添付ファイルを取得せずにドラフトを直接送信するにはどうすればよいですか?それを行うIMAPコマンドはありますか?
解決
IMAPはメールボックスプロトコルです。 (ネイティブでは)メールの送信をサポートせず、アクセスするだけです。メールを送信するには、SMTPを使用する必要があります 。メールを送信するためのIMAP拡張機能がある可能性があり、Google Mailがその拡張機能をサポートしている可能性がありますが、私はそれを疑います。したがって、添付ファイル付きのメールを送信する場合は、実際に送信できるメッセージの完全なコンテンツが必要です。
他のヒント
IMAPは、送信するのではなく、電子メールメッセージを受信するように設計されています。 EFAIKを送信するためのIMAPコマンドはありません。ただし、特別な「送信トレイ」フォルダーをサポートするIMAPサーバーが少なくとも1つあります。メッセージをこのフォルダーに入れると、自動的に送信されます。
IMAP接続を介したメール送信に関するCourier-IMAPドキュメント。これは非標準の方法であり、これをサポートする他のサーバーを認識していないことに注意してください。
そこには RFC 4468 があり、SMTPを拡張して、IMAPサーバーからメールコンテンツを取得できるようにします。 、しかし、実用的で広く使用されている実装については知りません。
gmailについて話す:SMTPを使用するのがおそらく最も安全な方法です。
ところで、最近のメールクライアント(Webベースのものを含む)は Sent フォルダーをサポートしているため、通常はSMTPとIMAPの両方を使用して1つのメールを送信する必要があります。また、SMTPを介して電子メールを送信することと、電子メールをIMAPの Sent フォルダーに保存すること成功との間には競合状態があります。 IMAPを使用して電子メールを送信すると、この競合状態を回避できます。
電子メールの送信は、一部のimapサーバーの特別な機能です。 imapプロトコルには何もありません。メールをサーバー上の特別なimapディレクトリにコピーして送信します。 gmailがこれをサポートしているとは思わない。
Python 3を使用してIMAPを使用してGmailアカウントに自分のメールアドレスにメールを送信しました。メールボックスにメッセージを追加します。少数のPythonネイティブライブラリを利用する必要があります。また、この imaplibのドキュメント、このコードはセクションメッセージのアップロード:にメールボックスに新しいメッセージを追加するには、Messageインスタンスを作成し、appendに渡します。 ()メソッド、およびメッセージのタイムスタンプ。
Gmailの受信トレイを確認すると、新しいメッセージが表示されます。
import imaplib
import time
import email.message
import imaplib_connect
new_message = email.message.Message()
new_message.set_unixfrom('name')
new_message['Subject'] = 'Test'
new_message['From'] = 'name@gmail.com'
new_message['To'] = 'name@gmail.com'
new_message.set_payload('This is an example message body.\n')
print(new_message)
with imaplib_connect.open_connection() as c:
c.append('INBOX', '',
imaplib.Time2Internaldate(time.time()),
str(new_message).encode('utf-8'))
# Show the headers for all messages in the mailbox
c.select('INBOX')
typ, [msg_ids] = c.search(None, 'ALL')
for num in msg_ids.split():
typ, msg_data = c.fetch(num, '(BODY.PEEK[HEADER])')
for response_part in msg_data:
if isinstance(response_part, tuple):
print('\n{}:'.format(num))
print(response_part[1])