我希望能够在python中发送电子邮件,以便我可以解析弹跳。 VERP似乎是解决这个问题的方法。但是,当我将地址(不是MIMEMultipart对象的“From”值)设置为包含VERP分隔符时,我没有收到退回通知。
我可以组建自己的VERP发件人(即发送到user@domain.com,我可以设置我的收件人地址:mysender + user-domain-com.mydomain.com“)并期待它工作,还是我需要配置postfix以正确解析失败的DSN?我的问题是收到失败通知,而不是在我这样做时将消息传递给有效的收件人。
也许一个例子会有所帮助。
当我从myuser@domain.com发送电子邮件时,我收到退回通知就好了。
当我从myuser+verp_identifier@domain.com发送电子邮件时,我没有收到任何退回通知。 (虽然正确处理的电子邮件,例如,发送到:valid_user@gmail.com就好了。) Perl's Mail module有一个Verp子模块,python有这样的东西吗?
答案 0 :(得分:3)
你应该使用" Return-Path"不是FROM作为退回邮件的发送地址。使用Postfix在出站邮件中指定返回路径不需要特殊配置。
Postfix处理变量入站消息的配置要求可以使用地址中的+来处理,因为+和后面的所有内容通常都会被忽略。因此,将Return-Path设置为joe+bounce@here.com应该通过地址joe+bounce@here.com发送到joe@here.com。可以通过在master.cf文件中添加过滤器来对消息进行编程处理。
将其放入服务列表中:
smtp inet n - - - - smtpd
-o content_filter=filter:dummy
并在此处定义过滤器:
filter unix - n n - 10 pipe
flags=Rq user=filter null_sender=
argv=/home/filter/InboundProcessor.py -f ${sender} -- ${recipient}
这将导致InboundProcessor.py脚本通过管道接收所有入站消息。如果To地址包含一个+后面的某个退回键值,您可以将其与不再有效的地址相关联,则可以在数据库中将该地址标记为无效。
答案 1 :(得分:1)
为了正确处理VERP,必须特别配置Postfix。列出允许使用VERP的客户端的smtpd_authorized_verp_clients
仅配置发送部分。事实上,它列出了允许使用XVERP命令的客户端,该命令会自动将+dest
添加到enveloppe发件人地址。
但在其默认配置Postfix中,不会自动将sender
发送给sender+ext
的邮件发送给recipient_delimiter = +
。为此,您必须在main.cf
中添加(或取消注释)myuser+verpid@domain.com
。在默认配置中,该行存在但已注释掉。
因此,如果您可以形成自己的VERP发件人地址,即envelope发件人地址为recipient_delimiter = +
,则只要您拥有/etc/postfix/main.cf:
smtpd_command_filter = pcre:/etc/postfix/append_verp.pcre
smtpd_authorized_verp_clients = $mynetworks
/etc/postfix/append_verp.pcre:
/^(MAIL FROM:<listname@example\.com>.*)/ $1 XVERP
,就无需再做任何事情:目标SMTP服务器会向其发送退回地址和您的Postfix将正确地将其发送到myuser@domain.com。
我不知道任何会自动添加XVERB命令的python包。所以恕我直言,如果你想让它自动使用,你应该遵循Postfix VERP Howto中描述的以下配方:
您可以使用smtpd_command_filter功能将XVERP附加到旧版软件的SMTP命令中。这需要Postfix 2.7或更高版本。
{{1}}