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

2024-06-17 12:29:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过IMAP将电子邮件草稿存储到msexchange上运行的文件夹中。一切正常,除了密件抄送收件人不会显示在服务器上存储的草稿邮件中。如果我用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文件夹中。但是如果我用msoutlook查看草稿,它不包括bcc收件人(message['bcc'] = 'testbcc@test.com')。Messagetofromcc好,没有错误。在

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

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

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

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


Tags: fromtestimport服务器文件夹commessageserver
3条回答

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

我知道你不是在发送电子邮件,而是在存储它。但我的猜测是,当消息是追加IMAP,导致密件抄送字段被剥离。在

显然,使用Outlook将邮件保存到文件夹中时,“密件抄送”字段不会被剥离。但我想outlook是使用一些内部机制(MAPI?)与Exchange通信的。在

以上都只是猜测。在

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

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

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

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

请尝试设置此BCC标头的替代版本:

X-Receiver: someguy@gmail.com

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

显然,这是一次彻底的黑客攻击。在

实际上,代码运行得很好。它创建正确的邮件,包括密件抄送。在

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

mail client(例如,在我的例子中,通过IMAP或MAPI的Python或msoutlook)决定是否以及如何显示密件抄送标头。例如,Outlook不显示IMAP文件夹中的密件抄送邮件头。这是一个将密件抄送收件人彼此隐藏的功能(标准中不清楚是否允许一个密件抄送收件人查看所有其他密件抄送收件人,请参见Wikipedia)。在

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

假设我们已经起草了一个邮件,或者说我们已经把它储存在一个邮件文件夹里。提供IMAP/MAPI文件夹的服务器保持邮件草稿不变。发送邮件时,密件抄送头的情况取决于实现,可能同时依赖于邮件客户端和mail transfer agent(例如,在我的例子中是MS-Exchange服务器)。简而言之,人们不同意邮件客户端或邮件传输代理是否有责任删除密件抄送标头。然而,似乎大多数开发人员认为邮件客户端与邮件传输代理之间的业务是不接触邮件的(例如MS Exchange、MS SMTP、Exim、OpenWave)。在这种情况下,邮件传输代理将电子邮件发送给在SMTP通信的RCPT TO:中定义的收件人,否则将保持电子邮件不变。但是,其他一些邮件传输代理会从电子邮件中剥离密件抄送邮件头(例如sendmail、lotusnotes)。从here开始,可以在Exim邮件列表中找到非常深入的讨论。在

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

结论

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

相关问题 更多 >