如何在后缀中收集反弹


15

这与此问题有关:

linux-如何为我的新闻通讯应用程序获取退回报告?-服务器故障

假设我发送新闻稿以识别跳动并从新闻稿中取消订阅时,正在生成这样的电子邮件地址:bounce-123456789@example.com

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

那么我将如何在postfix中进行设置,以将所有带有“ bounce-”前缀的地址收集到一个邮箱中?

最后,我听说有人提到软弹和硬弹。有人可以解释不同之处吗?应该如何计算他们的时间,才能知道何时从电子邮件时事通讯中永久删除某人?


请注意,包含单词“ bounce”的电子邮件地址也可能被视为“ yuck” ...(垃圾邮件),也就是说,如果您可以将自己的邮件粘贴Message-Id在标题中,则必须将其发送回去,足以检查谁是谁。
亚历克西斯·威尔克

Answers:


17

问题的确切答案(处理bounce-xxx@example.com地址)取决于服务器配置为接收邮件的方式。如果example.com是虚拟域,那么您最好的办法就是收集bounce@example.com邮箱中的邮件(假设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

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

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


哦,我喜欢使用接收方分隔符对它们进行分组的想法。通常使用+对吗?我认为效果很好,谢谢!
布赖恩·阿姆斯特朗

11

实际上,如果您要支持许多不同的域,那么Instyle的答案很难实现,这是错误的,因为:

a)以他的例子 transport_maps,所有发送到该域的电子邮件都发送到该特定服务,而无需考虑该电子邮件是否为退回电子邮件。由于它使用特定的域名,因此确实应该只将其退回电子邮件...但是不能以此方式保证。

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


在后缀中进行该设置的正确方法是使用退回通知类。

1)在/etc/postfix/main.cf中

notify_classes = bounce
bounce_notice_recipient = bounces@example.com
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
bounces@example.com bulkbounce:

如您所见,我们现在告诉postfix bounces@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}

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

useradd bounce

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


从下面的评论:

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


使用您的方式,我以某种方式收到两次退回,一次是bounce + id @ ...,另一次是bounce @ ...来自两次反弹-(用户反弹实际上在系统上不存在-因为我不打算“保存”这些电子邮件)。电子邮件发送时的返回路径为bounce + id @...。
RVandersteen '17

@ RVandersteen我不太确定为什么你会两次。与一个+id@可能是某种类型的信封?
亚历克西斯·威尔克

当我使用默认的“发件人”地址-退回邮件仍会发送到bounce@example.com和originalfrom@example.com(不再添加返回路径)
RVandersteen '17

1
供将来参考,添加notify_classes不会改变MTA向“发件人/返回路径”发送退回邮件的行为。它在其之上添加了行为(也将其发送到notify_bounce_recipient)。这就是为什么我收到双封邮件的原因。以上回答了我的问题
RVandersteen

1
fyi-re:两次退回..如果您正在修改返回地址(VERP地址,例如“ user+id@fromdomain.com”,那么您将需要注释掉main.cf中的“ bounce_notice_recipient”行,如果您只想解析脚本中的+ id反弹,
sarora

1

如果MTA已正确配置为将VERP消息传递回邮件列表软件,则大多数现代邮件列表软件已经知道如何处理VERP消息。对于GNU Mailman,您应该检出FAQ页面,将其恰当地命名为“如何将VERP与-分隔符(Postfix receiver_delimiter)一起使用?”。

如果您要制作自己的自定义新闻通讯软件来处理此问题,则应问自己为什么要重新发明轮子,而不是使用现有的可以轻松简单地处理任务的应用程序。


是的,我正在制作自己的新闻通讯软件。有充分的理由!
布赖恩·阿姆斯特朗,2009年

然后,您应该看看让它使用VERP正确处理反弹。
杰里米·布斯

嗨,杰里米,我认为您是对的VERP是此处的标准解决方案,尽管它似乎仅用于识别发件人和收件人。在这种情况下,我们还需要确定引起反弹的特定消息,因此我相信我们必须使用地址中的自己的ID进行自定义解决方案。我认为下面提到的使用接收方分隔符的解决方案将使我们将它们分组到一个退回帐户中。感谢您的回复,尽管我感谢您的帮助!
布赖恩·阿姆斯特朗

Insyte的解决方案只是其核心,是经过改进的VERP。您只需要确保它为反弹处理程序提供足够的唯一标识符即可识别它。在大多数邮件列表软件中,这是电子邮件地址,但是可以是任何东西,因为您是在设计自己的电子邮件地址。
杰里米·布斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.