29

我正在为手机开发一个轻量级的 Gmail 客户端,通过 IMAP 访问 Gmail。我想从草稿文件夹发送草稿,但它有一些附件,我无法下载所有附件以通过 SMTP 发送。

将其移动/复制到“已发送邮件”不会发送它,只是将其移动到该文件夹​​。

如何在不从客户端获取所有内容和附件的情况下直接发送草稿?是否有任何 IMAP 命令可以做到这一点?

4

5 回答 5

48

IMAP 是一种邮箱协议。它(本机)不支持发送邮件,只支持访问它。为了发送邮件,您必须使用 SMTP。可能有一个用于发送邮件的 IMAP 扩展,并且 Google Mail 可能支持该扩展,但我对此表示怀疑。因此,如果您想发送带有附件的电子邮件,您实际上必须拥有可供您发送的邮件的全部内容。

于 2009-10-26T22:46:35.183 回答
14

IMAP 旨在接收电子邮件,而不是发送电子邮件。没有用于发送电子邮件 AFAIK 的 IMAP 命令。但是,至少有一个 IMAP 服务器支持特殊的“发件箱”文件夹。当您将消息放入此文件夹时,它将自动发送。

查看有关通过 IMAP 连接发送邮件的 Courier-IMAP 文档。请注意,这是一种非标准方法,我不知道有任何其他服务器支持此方法。

RFC 4468扩展了 SMTP,因此它可以从 IMAP 服务器获取邮件内容,但我不知道任何有效且广泛使用的实现。

谈论 gmail:坚持使用 SMTP 可能是最安全的方法。

于 2009-10-27T18:13:29.660 回答
5

顺便说一句,现在任何现代邮件客户端(包括基于 Web 的客户端)都支持Sent文件夹,您通常必须同时使用 SMTP 和 IMAP 来发送一封邮件。在通过 SMTP 发送电子邮件和成功将电子邮件保存到 IMAP Sent文件夹之间存在竞争条件。使用 IMAP 发送电子邮件是避免这种竞争条件的一种方法。

于 2013-12-26T19:01:19.260 回答
1

发送电子邮件是某些 imap 服务器的一项特殊功能。它在 imap 协议中没有任何内容。您只需将您的电子邮件复制到服务器上的一个特殊 imap 目录中,然后它就会发送它们。我怀疑gmail是否支持这一点。

于 2009-10-26T23:31:46.003 回答
0

我使用 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])
于 2016-06-17T20:32:00.730 回答