用Python发送邮件 - 如何设置与'发件人'地址不同的Return-Path
我想做的是用lamson(lamsonproject.org)搭建一个小型邮件服务器。它运行得很好,但我在设置退回路径时遇到了问题,因此,退回的邮件都发到了“发件人”地址,结果没能到达我的邮件服务器。
Lamson使用Python的smtplib来发送邮件。
我的项目和SMTP服务器之间的“对话”是这样的:
send: 'ehlo xxx.mydomiain.com\r\n'
reply: '250-smtp.smtpserver.com\r\n'
reply: '250-PIPELINING\r\n'
reply: '250-SIZE 20000000\r\n'
reply: '250-VRFY\r\n'
reply: '250-ETRN\r\n'
reply: '250-STARTTLS\r\n'
reply: '250-XVERP\r\n'
reply: '250 8BITMIME\r\n'
reply: retcode (250); Msg: smtp.smtpserver.com
PIPELINING
SIZE 20000000
VRFY
ETRN
STARTTLS
XVERP
8BITMIME
send: u'mail FROM:<me@myotherdomain.com> size=352\r\n'
reply: '250 Ok\r\n'
reply: retcode (250); Msg: Ok
send: u'rcpt TO:<pleasebouncethis@myotherdomain.com>\r\n'
reply: '250 Ok\r\n'
reply: retcode (250); Msg: Ok
send: 'data\r\n'
reply: '354 End data with <CR><LF>.<CR><LF>\r\n'
reply: retcode (354); Msg: End data with <CR><LF>.<CR><LF>
data: (354, 'End data with <CR><LF>.<CR><LF>')
send: 'MIME-Version: 1.0\r\nTo: pleasebouncethis@myotherdomain.com\r\nSubject: Testing bounces\r\nSender: MAILER-DAEMON@mydomiain.com\r\nReturn-Path: MAILER-DAEMON@mydomain.com\r\nReply-To: MAILER-DAEMON@mydomain.com\r\nMessage-Id: 377b8dcdf661810d3dc73a4a01fe23b3\r\nFrom: me@myotherdomain.com\r\nContent-Type: text/plain; charset="utf-8"\r\nContent-Transfer-Encoding: base64\r\n\r\nc2RmZ2TDpGfDpGRsZsOkZ2xkZmc=\r\n.\r\n'
reply: '250 Ok: queued as E635D157D3\r\n'
reply: retcode (250); Msg: Ok: queued as E635D157D3
data: (250, 'Ok: queued as E635D157D3')
send: 'quit\r\n'
reply: '221 Bye\r\n'
reply: retcode (221); Msg: Bye
Done
所以我可以看到,退回路径确实在邮件头中。
在寻找答案时,我发现了这个链接:用Python的sendmail设置MIME消息的退回路径
这个答案最后的评论是:错误/退回等应该发送到信封发件人,而不是“发件人”地址。
在查找信封发件人以及如何指定时,我碰到了这篇维基百科文章:http://en.wikipedia.org/wiki/Bounce_address
这篇文章列出了其他可能的邮件头参数,比如:退回路径、反向路径、信封发件人、MAIL FROM、2821-FROM、退回地址、From_、错误发送到。
我把这些都放进了邮件头中,结果 - 成功了。
我现在的问题是 - 我真的需要在邮件头中总是列出这么多可能的退回路径选项吗?邮件服务器现在是否已经配置为接受其中一两个参数?有没有更好的方法确保当邮件退回时,能返回到我的邮件服务器?
Alan.
2 个回答
在 sendmail(from_addr, to_addrs, msg, mail_options=[], rcpt_options=[])
这个函数中,你用的 from_addr
会被设置为 Return-Path
,也就是邮件的返回地址。
而你通过这个函数发送的 msg
可以包含一个不同的 From:
头部,这个头部是人们在打开邮件时看到的正常发件人地址。
你可以在 smtplib 的文档 中看到这一点。文档中提到:
from_addr
和to_addrs
这两个参数是用来构建邮件的信封的,发送邮件的过程中不会对邮件的头部进行任何修改。
如果你是在发送邮件,那么你不需要设置那些头信息;正确的发件人信息应该放在 MAIL FROM:
命令里,所以在你的情况下:
MAIL FROM:<MAILER-DAEMON@mydomain.com>
因为这个命令是SMTP协议的一部分,而不是邮件内容本身,所以接收方的邮件服务器会添加一个Return-Path头信息,以便于过滤器或其他后续处理使用,这样在原始SMTP信封不可用的情况下也能找到信息。你可以参考一下RFC2821:
当发送SMTP服务器完成邮件的“最终投递”时,它会在邮件数据的开头插入一个return-path行。这个return-path的使用是必须的;邮件系统必须支持它。return-path行保留了来自MAIL命令的<reverse-path>信息。