email - 解析退回的电子邮件

标签 email

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

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

我的目标是保护我的域的邮寄声誉。我只发送事务性电子邮件,但一段时间后,其中一些收件箱变得陈旧,邮件会退回。我不想每周向那些退回的地址发送电子邮件。

我找不到很多最近的问题,而且没有一个实际的解决方案:

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

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

请注意,电子邮件的“返回路径”与“回复”不同。 “返回路径”仅被邮件服务器用于在出现问题时将电子邮件退回到原始服务器。

简而言之,假设我们要从 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"

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

关于email - 解析退回的电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28817868/

相关文章:

windows - 如何在 Windows 上安装 Email::Sender?

javascript - 电子邮件未发送。 ajax发送的值

php - 跟踪 href=tel : link

image - 使用 Grails 在电子邮件中发送图像

vba - 重命名并保存 Outlook 中的附件

html - 排除电子邮件表达式的正则表达式

email - HTML 电子邮件开发和边距 block

laravel - 如何使用 Mailgun 和 Laravel 发送电子邮件?

Javamail : Not able to send an email with message body, 文本/html 和附件。

c# - 如何在 Azure 中以编程方式接收电子邮件?