这与这个问题相关:
linux – 如何获取我的新闻通讯应用程序的退回报告? - 代码日志
假设我在发送新闻稿以识别退回邮件并取消订阅新闻稿时生成了如下电子邮件地址:[电子邮件保护]
我认为我会在返回路径中使用它,对吗?
那么我该如何在 postfix 中设置将所有以“bounce-”为前缀的地址收集到一个邮箱中?
最后,我听到有人提到软退回和硬退回。有人能解释一下它们的区别吗?如何计算它们,才能知道何时永久将某人从电子邮件通讯中删除?
答案1
您的问题(处理地址)的确切答案[email protected]
取决于您的服务器如何配置以接收邮件。如果example.com
是虚拟域,您能做的最好的事情就是收集邮箱中的邮件[email protected]
(假设recipient_delimiter = -
)。
如果example.com
是服务器的本地交付域(邮件交付到实际系统帐户),那么您可以将.forward
文件添加到用户的主目录bounce
,该文件将交付给解析退回信息并将其记录在数据库或文件中的程序。请参阅有关格式和如何交付给程序的man local
更多信息。.forward
由于我们要向大量域发送消息,因此我们的做法是将其用作bounces.example.com
我们的 VERP 域。此域需要添加到relay_domains
。/etc/postfix/transport_maps
使用以下内容创建:
bounces.example.com bulkbounce:
然后将类似于下面的一行附加到/etc/postfix/master.cf
:
bulkbounce unix-nn--管道 用户 = 无人 argv = /usr/local/bin/bounce_handler.py ${recipient}
该bounce_handler.py
脚本接受 VERP 地址作为其命令行选项,对其进行解析并进行必要的数据库更新以记录退回。
答案2
实际上,如果您想支持许多不同的域,Instyle 的答案很难实现,而且它是错误的,因为:
a) 以他的例子来说transport_maps
,所有发送到该域名的电子邮件都会发送到该特定服务,无论这些电子邮件是否被退回。由于它使用特定的域名,因此它确实应该只是退回的电子邮件……但不能保证这样做。
b) 发送到脚本的数据是电子邮件本身,而不是退回邮件。换句话说,您的代码可能不知道电子邮件被退回的原因(即本地退回只会向您发送原始电子邮件)。
在 Postfix 中执行该设置的正确方法是使用退回通知类。
1)在/etc/postfix/main.cf
notify_classes = bounce
bounce_notice_recipient = [email protected]
transport_maps = hash:/etc/postfix/transport_maps
2)在/etc/postfix/transport_maps
# when you make changes to this file, run:
# sudo postmap /etc/postfix/transport_maps
[email protected] bulkbounce:
如您所见,我们现在告诉 postfix[email protected]
每当电子邮件被退回时使用。然后在传输图中,使用bulkbounce
作为处理任何电子邮件地址的服务[email protected]
。
最后你可以bulkbounce
用你的脚本定义:
3)在/etc/postfix/master.cf
bulkbounce unix - n n - - pipe
flags=FRq user=bounce argv=/home/bounce/bin/snapbounce --sender ${sender} --recipient ${recipient}
此脚本要求您有一个用户。nobody
也是一个不错的选择。如果您想要一个特定的用户,您可以使用以下命令创建它:
useradd bounce
如果没有 中的脚本master.cf
,电子邮件将被发送到批量退回帐户。因此,如果您有一个从文件解析电子邮件的脚本,则无需 和transport_maps
更改即可运行master.cf
。
来自以下评论:
仅供参考——关于:双重反弹...
如果您正在修改返回地址(VERP 地址,例如[email protected]
,那么您将需要注释掉中的行main.cf
,bounce_notice_recipient
如果您+id
只对在脚本中解析反弹感兴趣。