我正在为手机开发一个轻量级的 Gmail 客户端,通过 IMAP 访问 Gmail。我想从草稿文件夹发送草稿,但它有一些附件,我无法下载所有附件以通过 SMTP 发送。
将其移动/复制到“已发送邮件”不会发送它,只是将其移动到该文件夹。
如何在不从客户端获取所有内容和附件的情况下直接发送草稿?是否有任何 IMAP 命令可以做到这一点?
IMAP 是一种邮箱协议。它(本机)不支持发送邮件,只支持访问它。为了发送邮件,您必须使用 SMTP。可能有一个用于发送邮件的 IMAP 扩展,并且 Google Mail 可能支持该扩展,但我对此表示怀疑。因此,如果您想发送带有附件的电子邮件,您实际上必须拥有可供您发送的邮件的全部内容。
IMAP 旨在接收电子邮件,而不是发送电子邮件。没有用于发送电子邮件 AFAIK 的 IMAP 命令。但是,至少有一个 IMAP 服务器支持特殊的“发件箱”文件夹。当您将消息放入此文件夹时,它将自动发送。
查看有关通过 IMAP 连接发送邮件的 Courier-IMAP 文档。请注意,这是一种非标准方法,我不知道有任何其他服务器支持此方法。
RFC 4468扩展了 SMTP,因此它可以从 IMAP 服务器获取邮件内容,但我不知道任何有效且广泛使用的实现。
谈论 gmail:坚持使用 SMTP 可能是最安全的方法。
顺便说一句,现在任何现代邮件客户端(包括基于 Web 的客户端)都支持Sent文件夹,您通常必须同时使用 SMTP 和 IMAP 来发送一封邮件。在通过 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])