解析退回(无法送达)电子邮件的最佳方法是什么?
当电子邮件退回到我的服务器时,我想找出它退回的原因(软/硬)以及无法送达的电子邮件地址。然后我可以在我的数据库中适当地处理它和/或标记用户在下次登录时更新他们的电子邮件。
我的目标是保护我的域的邮寄声誉。我只发送事务性电子邮件,但一段时间后,其中一些收件箱变得陈旧,邮件会退回。我不想每周向那些退回的地址发送电子邮件。
我找不到很多最近的问题,而且没有一个实际的解决方案:
1)如何解析从 Mailer Deamons 退回的传递状态通知电子邮件
我希望有某种开源库可以帮助解析无法送达的电子邮件,但似乎找不到类似的东西。肯定人们已经处理这个问题很长时间了......
我想在我的服务器上处理这个问题,而不是通过 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
Run Code Online (Sandbox Code Playgroud)
以上给出了所有硬反弹。对于软弹跳,请使用" dsn=4."
。
该解决方案的优点是非常容易实施。缺点是我们必须依靠 postfix 来正确解析消息,如果您发送到邮件列表而不是单个收件人,它可能无法正常工作。
2) VERP
可变信封返回路径 (VERP) 为每个电子邮件收件人使用唯一的返回路径。(见维基百科说明)
请注意,电子邮件的“返回路径”与“回复”不同。“返回路径”仅被邮件服务器用于在出现问题时将电子邮件退回到原始服务器。
简而言之,假设我们要从mymailinglist@mysite.com向richard@exapmle.com发送一封电子邮件。如果您以正常方式发送它,您将收到一条退回邮件,并且必须解析该邮件以找出它被发送给谁。但是使用 verp,您将返回路径设置为bouncelist+richard+example.com@mysite.com。
现在,您可以专门为退回的电子邮件设置邮箱 (bouncelist@mysite.com)。默认情况下,postfix 会忽略电子邮件地址中“+”之后的任何内容,因此所有退回的邮件都会转到同一个地方。但是现在原始电子邮件收件人 ( richard@exapmle.com ) 包含在返回路径中并且可以轻松解析出来。
如果您愿意,还可以使用虚拟邮箱将邮件直接发送到脚本。在 /etc/postfix/virtual 添加行
bouncelist: "| php mybounceparser.php"
Run Code Online (Sandbox Code Playgroud)
此解决方案实施起来肯定更复杂,但可能是大型邮件列表的唯一选择。