【问题标题】:Send VERP compliant email using python and postfix使用 python 和 postfix 发送符合 VERP 标准的电子邮件
【发布时间】:2014-07-04 18:22:01
【问题描述】:

我希望能够在 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's Mail module有一个verp子模块,python有这样的吗?

【问题讨论】:

  • 你的 Postfix 是本地的吗?如果没有,根据 Postfix VERP Howto,你必须声明一个 smtpd_authorized_verp_clients
  • @SergeBallesta 我的后缀不是本地的,但我已经声明了所需的配置设置。我想我需要在我的邮件信封中以某种方式激活“VERP 模式”,而不仅仅是在我的发件人地址中添加一个 + 号。问题是 postfix 没有将返回的消息解析到正确的框;外发邮件正常到达,但退回邮件未正确返回给发件人。

标签: python postfix-mta verp


【解决方案1】:

您应该使用“返回路径”而不是 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 脚本通过管道接收所有入站消息。如果收件人地址包含一个 + 后跟一些退回键值,您可以将其与不再有效的地址相关联,您可以在数据库中将该地址标记为非活动。

【讨论】:

    【解决方案2】:

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

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

    因此,如果您可以形成自己的 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
    

    【讨论】:

      猜你喜欢
      • 2015-08-19
      • 2016-12-27
      • 2012-11-20
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 2015-06-24
      • 2014-06-28
      • 2011-04-08
      相关资源
      最近更新 更多