解析退回的电子邮件
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.com 向 richard@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 批量验证页面并清理它们。验证完成后,您可以下载结果并导入回您的数据库。
解析退回(无法投递)电子邮件的最佳方法是什么?
当一封电子邮件被退回我的服务器时,我想找出它被退回的原因 (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.com 向 richard@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 批量验证页面并清理它们。验证完成后,您可以下载结果并导入回您的数据库。