6

我尝试通过 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() 

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

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

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

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

结论:感谢您的输入。实际上,代码工作得很好。请参阅下面的我找到的答案。

4

3 回答 3

6

实际上,代码工作得很好。它使用包括密件抄送在内的所有正确标题创建正确的邮件。

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

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

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

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

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

结论

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

于 2009-05-28T13:22:51.230 回答
1

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

我了解您没有发送电子邮件,只是存储它。但我的猜测是,当邮件被 IMAP.append 到文件夹时,Exchange 的内部规则就会启动,从而导致密件抄送字段被剥离。

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

以上只是猜测。

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

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

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

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

于 2009-04-21T12:02:01.707 回答
1

尝试设置密件抄送标头的替代版本:

X-Receiver: someguy@gmail.com

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

显然,这是一个完整的黑客攻击。

于 2009-04-21T13:07:21.033 回答