使用python和postfix发送符合VERP标准的电子邮件

时间:2014-05-16 04:55:22

标签: python postfix-mta verp

我希望能够在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有这样的东西吗?

2 个答案:

答案 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}}