有几种方法可以做到这一点。
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"
这个解决方案的实现可能更加复杂,但对于大型邮件列表来说可能是唯一的选择。