1

我希望能够在 python 中发送电子邮件,以便我可以解析退回邮件。VERP 似乎是解决这个问题的方法。但是,当我将发件人地址(不是 MIMEMultipart 对象的“发件人”值)设置为包含 VERP 分隔符时,我没有收到退回通知。

我可以形成自己的 VERP 发件人(即发送到 user@domain.com,我可以设置我的 From: 地址为那个收件人“mysender+user-domain-com.mydomain.com”)并期望它工作吗?还是我需要配置后缀以以某种方式正确解析失败的 DSN?我的问题是收到失败通知,当我执行此操作时没有将消息传递给有效的收件人。

也许一个例子会有所帮助。

当我从 myuser@domain.com 发送电子邮件时,我收到退回通知就好了。

当我从 myuser+verp_identifier@domain.com 发送电子邮件时,我没有收到任何退回通知。(虽然正确寻址的电子邮件,例如:valid_user@gmail.com 通过就好了。) Perl 的邮件模块有一个 Verp 子模块,python 有这样的东西吗?

4

2 回答 2

3

您应该使用“返回路径”而不是 FROM 作为退回邮件的发送地址。使用 Postfix 在出站消息中指定返回路径不需要特殊配置。

Postfix 处理可变入站消息的配置要求可以用地址中的 + 来处理,因为 + 和后面的所有内容通常被忽略。因此,将 Return-Path 设置为 joe+bounce@here.com 应发送到 joe@here.com,收件人地址为 joe+bounce@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 脚本通过管道接收所有入站消息。如果收件人地址包含一个 + 后跟一些退回键值,您可以将其与不再有效的地址相关联,您可以在数据库中将该地址标记为非活动。

于 2014-05-22T23:39:19.773 回答
1

为了正确处理VERP,必须专门配置Postfix。smtpd_authorized_verp_clients允许您使用 VERP 的客户端列表仅配置发送部分。事实上,它列出了允许使用自动添加+dest到信封发件人地址的 XVERP 命令的客户端。

但是在其默认配置中,Postfix不会自动将发送到sender的消息传递给sender+ext. 为此,您必须recipient_delimiter = +main.cf. 在默认配置中,该行存在但被注释掉。

因此,如果您可以形成自己的 VERP 发件人地址,即信封发件人地址为myuser+verpid@domain.com,那么您无需再做任何事情recipient_delimiter = +:目标 SMTP 服务器将向该地址发送退回邮件,并且您的 Postfix 将正确地将其发送到 myuser@domain。 com。

我不知道任何会自动添加 XVERB 命令的 python 包。因此,恕我直言,如果您希望它自动使用,您应该遵循Postfix VERP Howto中描述的以下配方:

您可以使用 smtpd_command_filter 功能将 XVERP 附加到来自旧版软件的 SMTP 命令。这需要 Postfix 2.7 或更高版本。

/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
于 2014-05-19T22:20:26.147 回答