Python:如何通过 IMAP 将带有密件抄送收件人的草稿电子邮件存储到 Exchange Server?

Posted

技术标签:

【中文标题】Python:如何通过 IMAP 将带有密件抄送收件人的草稿电子邮件存储到 Exchange Server?【英文标题】:Python: how to store a draft email with BCC recipients to Exchange Server via IMAP? 【发布时间】:2010-10-20 18:58:54 【问题描述】:

我尝试通过 IMAP 将电子邮件草稿存储到 MS Exchange 上运行的文件夹中。一切正常,除了密件抄送收件人未显示在存储在服务器上的草稿消息中。如果我使用 MS Outlook 发送电子邮件,密件抄送收件人也不会收到电子邮件。如果我将消息存储在服务器上后用 Python 回读,我可以在草稿中看到密件抄送。

以下 Python 代码重现了这种行为:

import imaplib 
import time 
from email.MIMEMultipart import MIMEMultipart 
from email.MIMEText import MIMEText 

message = MIMEMultipart() 
message['Subject'] = 'Test Draft' 
message['From'] = 'test@test.net' 
message['to'] = 'test@test.com' 
message['cc'] = 'testcc@test.com' 
message['bcc'] = 'testbcc@test.com' 
message.attach(MIMEText('This is a test.\n')) 

server= imaplib.IMAP4('the.ser.ver.ip') 
server.login('test', 'test') 
server.append("Drafts" 
              ,'\Draft' 
              ,imaplib.Time2Internaldate(time.time()) 
              ,str(message)) 
server.logout() 

如果我运行此代码,草稿会存储到 Exchange Server 上的 Draft 文件夹中。但是如果我用 MS Outlook 查看草稿,它不包括bcc 收件人(message['bcc'] = 'testbcc@test.com')。 Message, to, from, cc 好的,没有错误。

如果我从 Exchange 文件夹下载已包含密件抄送的草稿,我也可以看到密件抄送。仅上传对我不起作用。

非常感谢任何帮助。谢谢。顺便说一句,MAPI 不是一个选项。

更新:谢谢。 X-Receiver 对我不起作用。至于在 Outlook 中使用 IMAP 文件夹,我得到了一个有趣的结果。如果我通过 Outlook 中的 IMAP 文件夹访问草稿,我会看到密件抄送。但如果我通过 MAPI 文件夹访问它,我看不到它。会玩一点。

结论:感谢您的意见。实际上,代码工作得很好。我找到的答案见下文。

【问题讨论】:

【参考方案1】:

设计上可能是这样的。毕竟,密件抄送的全部意义在于收件人彼此之间是隐藏的。

我了解您不是在发送电子邮件,而是将其存储起来。但我的猜测是,当邮件被 IMAP.append 到文件夹时,Exchange 的内部规则就会生效,从而导致密件抄送字段被剥离。

显然,当使用 Outlook 将邮件保存到文件夹时,密件抄送字段不会被删除。但我猜 Outlook 使用一些内部机制(MAPI?)与 Exchange 进行通信。

以上只是猜测。

你可以尝试一些有趣的事情:

在一个空的 Outlook/MAPI 配置文件中,创建一个 IMAP 帐户。将其设置为在 Exchange 服务器上存储草稿和已发送邮件。 查看使用 IMAP 的 Outlook 是否可以正确保存草稿的密件抄送。

我使用通过 IMAP 连接到 Exchange 的 Evolution 电子邮件客户端尝试了上述操作。使用outlook(以正常方式连接),然后我查看了草稿和已发送项目。两个地方都缺少密件抄送字段。

我相信这支持了我的理论。

【讨论】:

【参考方案2】:

尝试设置此备用版本的密件抄送标头:

X-Receiver: someguy@gmail.com

当您发送时,Exchange 会将其视为密件抄送。但我敢打赌,当您通过 IMAP 编写时,它不会剥离它。通过复制此行,您可以包含多个密件抄送收件人。

显然,这是一个完整的 hack。

【讨论】:

【参考方案3】:

实际上,代码运行良好。它创建包含所有正确标题的正确邮件,包括密件抄送。

邮件客户端如何显示密件抄送?

mail client(例如,在我的例子中,通过 IMAP 或 MAPI 的 Python 或 MS Outlook)决定是否以及如何显示密件抄送标题。例如,Outlook 不显示 IMAP 文件夹中的密件抄送标题。这是一项将密件抄送收件人彼此隐藏的功能,因为他们之前没有从邮件中剥离(从标准中不清楚是否允许一个密件抄送收件人查看所有其他密件抄送收件人,请参阅Wikipedia) .

谁在发送电子邮件时处理密件抄送?

现在假设我们已经在邮件客户端中起草了一封邮件并将其存储在 IMAP 或 MAPI 文件夹中。提供 IMAP / MAPI 文件夹的服务器保持草稿消息不变。发送邮件时 bcc-headers 会发生什么取决于实现,并且可能取决于邮件客户端和mail transfer agent(例如,在我的情况下是 MS Exchange Server)。简而言之,人们不同意是邮件客户端还是邮件传输代理负责删除密件抄送标头。然而,似乎大多数开发人员认为这是邮件客户端的业务,邮件传输代理不接触邮件(例如 MS Exchange、MS SMTP、Exim、OpenWave)。在这种情况下,邮件传输代理将电子邮件发送给SMTP 通信的RCPT TO: 中定义的收件人,否则保持电子邮件不变。但是,其他一些邮件传输代理会从电子邮件中删除密件抄送标头(例如 sendmail、Lotus Notes)。可以在以here 开头的 Exim 邮件列表中找到非常详尽的讨论。

对于 MS Outlook 和 MS Exchange,MS Outlook 从不发送密件抄送(而是为每个密件抄送收件人发送单独的电子邮件),并且 MS Exchange 不会触及电子邮件标题,而是将完整的电子邮件(可能包括密件抄送收件人)发送到RCPT TO: 中定义的收件人。

结论

我不明白密件抄送没有保证行为,并且通常客户端处理密件抄送。我将重写我的 Python 代码以遍历密件抄送收件人并为每个密件抄送收件人生成一封电子邮件。

【讨论】:

以上是关于Python:如何通过 IMAP 将带有密件抄送收件人的草稿电子邮件存储到 Exchange Server?的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 Mandrill 发送密件抄送电子邮件(通过 Laravel)

使用 PHPMailer 发送时事通讯(没有密件抄送的多个蒙面收件人)

如何使用mailgun php API仅将邮件发送到密件抄送? [复制]

如何仅为密件抄送设置 mailto

使用 swiftmailer 密件抄送多个地址

Ruby Net::SMTP - 使用密件抄送发送电子邮件:收件人