解析退回的电子邮件

Parse bounced email

解析退回(无法投递)电子邮件的最佳方法是什么?

当一封电子邮件被退回我的服务器时,我想找出它被退回的原因 (soft/hard) 以及无法送达的电子邮件地址。然后我可以在我的数据库中适当地处理它 and/or 标记用户在下次登录时更新他们的电子邮件。

我的目标是保护我的域的邮寄声誉。我只发送交易电子邮件,但过了一段时间后,其中一些收件箱变得陈旧并且邮件被退回。我不想继续每周向退回的地址发送电子邮件。

我找不到很多关于这个的最近问题,none 有一个实际的解决方案:

1) How to parse Delivery Status Notifications emails bounced from Mailer Deamons

2) Automatically remove bounced email addresses from database?

我希望有某种开源库来帮助解析无法送达的电子邮件,但似乎找不到类似的东西。人们肯定已经处理这个问题很长时间了...

我想在我的服务器上处理这个问题,而不是通过 sendgrid / mandrill / mailgun 等服务。

谁能指出我正确的方向? (我正在使用 Ubuntu 和 Postfix)

有几种方法可以做到这一点。

1) GREP

事实证明,postfix 在其日志文件中保留退回信息。所有永久性错误的 dsn 状态都以 5 开头。使用 grep,您可以获得具有该状态代码的电子邮件列表:

grep " dsn=5." /var/log/mail.log | grep -o -P " to=<(.+?)>" | sort | uniq -c

以上给出了所有硬退回。对于软退回,请使用 " dsn=4.".

此解决方案的优点是非常容易实施。缺点是我们必须依靠 postfix 来正确解析邮件,如果您发送到邮件列表而不是单个收件人,它可能无法正常工作。

2) VERP

可变信封 Return 路径 (VERP) 为每个电子邮件收件人使用唯一的 return 路径。 (参见 wikipedia description

请注意,电子邮件的 'return path' 与 'reply to' 不同。 'return path' 仅供邮件服务器在出现问题时将电子邮件退回到原始服务器。

简而言之,假设我们要从 mymailinglist@mysite.comrichard@exapmle.com[=46 发送电子邮件=].如果您以正常方式发送它,您将收到一条退回消息,并且必须解析该消息以确定它被发送给了谁。但是使用 verp,您将 return 路径设置为 bouncelist+richard+example.com@mysite.com.

现在您可以专门为退回的电子邮件设置一个邮箱 (bouncelist@mysite.com)。默认情况下,postfix 会忽略电子邮件地址中“+”之后的任何内容,因此所有退回的邮件都会转到同一个地方。但是现在原始的电子邮件收件人 (richard@exapmle.com) 包含在 return 路径中,可以很容易地解析出来。

如果愿意,您也可以使用虚拟邮箱将邮件直接发送到脚本。在 /etc/postfix/virtual 中添加行

bouncelist: "| php mybounceparser.php"

此解决方案实施起来当然更复杂,但可能是大型邮件列表的唯一选择。

考虑使用免费的 MailboxValidator API 在发送任何电子邮件之前筛选电子邮件地址。毕竟能避免反弹更好

https://www.mailboxvalidator.com/api-single-validation

那就是如果你愿意写一些代码。

否则,您的另一个选择是将邮寄列表的 CSV 文件上传到 MailboxValidator 批量验证页面并清理它们。验证完成后,您可以下载结果并导入回您的数据库。