解析退信邮件

4
什么是解析退回(无法投递)电子邮件的最佳方法?
当电子邮件反弹回我的服务器时,我想找出为什么它会反弹(软/硬)以及无法投递的电子邮件地址。然后我可以在我的数据库中适当地处理它和/或标记用户在下次登录时更新他们的电子邮件。
我的目标是保护我的域名邮件声誉。我只发送交易性电子邮件,但随着时间的推移,其中一些收件箱变得陈旧,邮件反弹回来。我不想继续向反弹的地址发送每周电子邮件。
我找不到关于此的许多最近问题,也没有实际解决方案:
1) 如何解析从Mailer Deamons反弹的传递状态通知电子邮件 2) 自动从数据库中删除反弹的电子邮件地址? 我期望有某种开源库可以帮助解析无法投递的电子邮件,但似乎找不到类似的东西。毫无疑问,人们已经处理这个问题很长时间了...

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

有人能指点我正确的方向吗?(我正在使用Ubuntu和Postfix)

2个回答

6

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

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

可变信封返回路径(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"

这个解决方案的实现可能更加复杂,但对于大型邮件列表来说可能是唯一的选择。


0
考虑使用MailboxValidator的免费API来在发送邮件之前对电子邮件地址进行筛选。如果可能的话,最好避免退信问题。

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

如果您愿意编写一些代码,那么这就是一个选择。

否则,您的另一个选择是将邮件列表的CSV上传到MailboxValidator批量验证页面并进行清理。一旦验证完成,您可以下载结果并重新导入到您的数据库中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接