如何在 postfix 中收集反弹

Bri*_*ong 16 email email-server postfix

这与这个问题有关:

linux - 如何为我的时事通讯应用程序获取反弹报告?- 服务器故障

假设我在发送时事通讯以识别退回邮件并从我的时事通讯中取消订阅它们时会生成这样的电子邮件地址:bounce-123456789@example.com

我想我会在返回路径中使用它,对吗?

那么我如何在 postfix 中设置它以将所有这些以“bounce-”为前缀的地址收集到一个邮箱中?

最后,我听到人们提到软弹跳与硬弹跳。有人可以解释一下不同之处以及应该如何计算它们以了解何时从电子邮件简报中永久删除某人吗?

Ins*_*yte 17

您问题的确切答案(处理bounce-xxx@example.com地址)取决于您的服务器如何配置为接收邮件。如果example.com是虚拟域,您可以做的最好的事情就是收集bounce@example.com邮箱中的邮件(假设recipient_delimiter = -)。

如果example.com是服务器的本地传递域(邮件传递到实际系统帐户),那么您可以.forwardbounce用户的主目录中添加一个文件,该文件传递给解析退回信息并将其记录在数据库或文件中的程序. 有关格式以及如何交付给程序的man local更多信息,请参阅.forward

我们所做的,因为我们为大量域发送消息,被bounces.example.com用作我们的 VERP 域。此域需要添加到relay_domains. /etc/postfix/transport_maps使用此内容创建:

bounces.example.com             bulkbounce:
Run Code Online (Sandbox Code Playgroud)

然后将类似于此的行附加到/etc/postfix/master.cf

批量弹跳 unix - nn - - 管道
  user=nobody argv=/usr/local/bin/bounce_handler.py ${recipient}

bounce_handler.py脚本接受 VERP 地址作为其命令行选项,对其进行解析并进行必要的数据库更新以记录反弹。


Ale*_*lke 14

实际上,如果您想支持许多不同的域,Instyle 的答案很难实现,而且是错误的,因为:

a) 以他的例子为例transport_maps,所有发送到该域的电子邮件都被发送到该特定服务,而不管这些电子邮件是否被退回电子邮件。由于它使用特定的域名,它确实应该只被退回电子邮件......但不能保证那样。

b) 发送到脚本的数据是电子邮件本身,而不是退回邮件。换句话说,您的代码可能不知道电子邮件被退回的原因(即本地退回只会向您发送原始电子邮件。)


在 postfix 中进行该设置的正确方法是使用反弹通知类。

1) 在/etc/postfix/main.cf

notify_classes = bounce
bounce_notice_recipient = bounces@example.com
transport_maps = hash:/etc/postfix/transport_maps
Run Code Online (Sandbox Code Playgroud)

2) 在/etc/postfix/transport_maps

# when you make changes to this file, run:
#   sudo postmap /etc/postfix/transport_maps
bounces@example.com bulkbounce:
Run Code Online (Sandbox Code Playgroud)

如您所见,我们现在告诉 postfixbounces@example.com在电子邮件被退回时使用。然后在传输映射中,bulkbounce用作处理任何电子邮件地址的服务bounces@example.com

最后,您可以bulkbounce使用脚本定义:

3) 在/etc/postfix/master.cf

bulkbounce unix -       n       n       -       -       pipe
  flags=FRq user=bounce argv=/home/bounce/bin/snapbounce --sender ${sender} --recipient ${recipient}
Run Code Online (Sandbox Code Playgroud)

此脚本要求您拥有一个用户。nobody也是不错的选择。如果您想拥有特定用户,可以使用以下命令创建它:

useradd bounce
Run Code Online (Sandbox Code Playgroud)

如果没有 中的脚本master.cf,电子邮件将发送到 bulkbounce 帐户。因此,如果您有一个从文件解析电子邮件的脚本,则无需更改transport_mapsmaster.cf更改即可。


从下面的评论:

仅供参考-重:双倍反弹...
如果你正在修改的返回地址(VERP地址等user+id@fromdomain.com,那么你将要注释掉线main.cfbounce_notice_recipient,如果你有兴趣在解析+id只在脚本中反弹。

  • 为了便于将来参考,添加 notification_classes 不会更改 MTA 将退回邮件发送到 FROM/Return Path 的行为。它在其之上添加行为(也将其发送到notify_bounce_recipient)。这就是为什么我收到两封邮件的原因。这回答了我上面的问题 (2认同)