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

Python:如何通过IMAP将带有密件抄送收件人的草稿电子邮件存储到Exchange Server?,python,email,exchange-server,imap,bcc,Python,Email,Exchange Server,Imap,Bcc,我尝试通过IMAP将草稿电子邮件存储到MS Exchange上运行的文件夹中。一切正常,但密件抄送收件人不会显示在服务器上存储的草稿邮件中。如果我使用MS Outlook发送,密件抄送收件人也不会收到电子邮件。如果在将消息存储到服务器上之后,用Python读回消息,我可以在草稿中看到Bcc 以下Python代码再现了此行为: import imaplib import time from email.MIMEMultipart import MIMEMultipart from email

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

以下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服务器上的
draft
文件夹中。但是如果我用MS Outlook查看草稿,它不包括
bcc
收件人(
message['bcc']='testbcc@test.com“
)<代码>消息,
cc
正常,无错误

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

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

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


结论:感谢您的投入。实际上,代码运行得很好。下面是我找到的答案。

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

我知道您不是在发送电子邮件,而是在存储它。但我的猜测是,当邮件被IMAP.附加到文件夹时,Exchange的内部规则就会生效,从而导致bcc字段被剥离

显然,使用Outlook将邮件保存到文件夹时,“密件抄送”字段不会被剥离。但我猜outlook使用某种内部机制(MAPI?)与Exchange进行通信

所有这些都只是猜测

你可以尝试一些有趣的东西:

  • 在空的Outlook/MAPI配置文件中,创建IMAP帐户。将其设置为在Exchange服务器上存储草稿和已发送的项目
  • 查看使用IMAP的outlook是否可以正确保存草稿的密件抄送
我使用通过IMAP连接到Exchange的Evolution电子邮件客户端尝试了上述操作。使用outlook(以正常方式连接),然后我查看了草稿并发送了邮件。两处都缺少bcc字段


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

尝试设置BCC标题的替代版本:

X-Receiver: someguy@gmail.com
特别是Exchange,在您发送此邮件时,会将其视为密件抄送。但我敢打赌,当你通过IMAP写东西的时候,它不会剥掉它。通过复制此行,可以包含多个密件抄送收件人


显然,这是一个完整的黑客程序。

实际上,代码运行得很好。它使用所有正确的邮件头(包括密件抄送)创建正确的邮件

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

(例如,在我的例子中,Python或MS Outlook通过IMAP或MAPI)决定是否以及如何显示bcc标题。例如,Outlook不显示IMAP文件夹中的密件抄送邮件头。这是一项功能,用于在以前未从邮件中删除密件抄送收件人的情况下相互隐藏密件抄送收件人(标准中不清楚是否允许一个密件抄送收件人查看所有其他密件抄送收件人,请参阅)

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

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

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

结论

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