web-dev-qa-db-ja.com

IMAPを使用してメールを送信するにはどうすればよいですか?

IMAPでGmailにアクセスして、携帯電話用の軽量のGmailクライアントを開発しています。下書きフォルダから下書きを送信したいのですが、添付ファイルがいくつかあり、それらをすべてダウンロードしてSMTPで送信することができません。

「送信済みメール」に移動/コピーしても送信されず、そのフォルダに移動さ​​れるだけです。

クライアントからすべてのコンテンツと添付ファイルを取得せずに、下書きを直接送信するにはどうすればよいですか?それを行うためのIMAPコマンドはありますか?

25
Ignacio Lago

IMAPはメールボックスプロトコルです。 (本来)メールの送信はサポートされず、アクセスのみがサポートされます。メールを送信するには必須 SMTPを使用します。メールを送信するためのIMAP拡張機能が存在する可能性があり、Google Mailがその拡張機能をサポートしている可能性がありますが、疑問です。したがって、添付ファイル付きの電子メールを送信する場合は、実際に送信できるメッセージの完全なコンテンツが必要です。

41
Jherico

IMAPは、電子メールメッセージを送信するためではなく、受信するために設計されました。 AFAIKに電子メールを送信するためのIMAPコマンドはありません。ただし、特別な「送信トレイ」フォルダをサポートするIMAPサーバーが少なくとも1つあります。このフォルダにメッセージを入れると、自動的に送信されます。

IMAP接続を介したメールの送信に関するCourier-IMAPドキュメント を確認してください。これは非標準的な方法であり、これをサポートする他のサーバーについては知りません。

あり RFC 4468 これはSMTPを拡張して、IMAPサーバーからメールコンテンツを取得できるようにしますが、実用的で広く使用されている実装については知りません。

Gmailについて話す:SMTPを使用するのがおそらく最も安全な方法です。

13
Martin Vobr

ちなみに、最近のメールクライアント(Webベースのメールクライアントを含む)は送信済みフォルダをサポートするようになったため、通常はSMTPとIMAPの両方を使用して1つのメールを送信する必要があります。また、SMTP経由での電子メールの送信と成功電子メールのIMAPへの保存送信済みフォルダーの間には競合状態があります。電子メールの送信にIMAPを使用すると、この競合状態を回避できます。

5
Pavel Šimerda

電子メールの送信は、一部のimapサーバーの特別な機能です。 imapプロトコルでは何もありません。メールをサーバー上の特別なimapディレクトリにコピーするだけで送信されます。 gmailがこれをサポートしているとは思えません。

1
Wienczny

Python 3をGmailアカウントに使用して、IMAPを使用して自分のメールアドレスにメールを送信しました。メールボックスにメッセージを追加することです。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'] = '[email protected]'
new_message['To'] = '[email protected]'
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])
1
Joansy