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

时间:2009-04-21 10:03:10

标签: python email exchange-server imap bcc

我尝试通过IMAP将草稿电子邮件存储到MS Exchange上运行的文件夹中。一切都还可以,但Bcc收件人不会显示在服务器上存储的草稿邮件中。如果我使用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')。 Messagetofromcc确定,没有错误。

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

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

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

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

3 个答案:

答案 0 :(得分:6)

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

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

mail client(例如,在我的情况下通过IMAP或MAPI的Python或MS Outlook)决定是否以及如何显示bcc-headers。例如,Outlook不显示IMAP文件夹中的密件抄送标头。这是一项隐藏密件抄送收件人的功能,之前他们没有被从邮件中删除(标准中不清楚是否允许一个密件抄送收件人看到所有其他密件抄送收件人,请参阅{{3} })。

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

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

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

<强>结论

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

答案 1 :(得分:1)

这可能是设计方式。毕竟,密件抄送的重点是收件人彼此隐藏。

我知道您不是发送电子邮件,只是存储它。但我的猜测是当邮件IMAP.appended到文件夹时,Exchange的内部规则启动,导致bcc字段被剥离。

显然,当使用Outlook将邮件保存到文件夹时,bcc字段被剥离。但我猜望Outlook使用一些内部机制(MAPI?)与Exchange通信。

以上所有只是猜测。

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

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

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

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

答案 2 :(得分:1)

尝试设置BCC标头的备用版本:

X-Receiver: someguy@gmail.com

特别是交换时,您会将其视为BCC。但我敢打赌,当你通过IMAP写作时,它不会剥离它。您可以通过复制此行来包含多个BCC收件人。

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