解析未送达的邮件头(退回的邮件)

解析未送达的邮件头(退回的邮件)

解析发送回我的服务器的退回(无法送达)电子邮件的标题并确定它是软退回还是硬退回的最佳方法是什么?

我只向我的用户发送选择加入的电子邮件,但偶尔有些电子邮件地址会过期。当电子邮件被退回到我的服务器时,我想找出它被退回的原因(软/硬)。然后我可以在我的数据库中适当地处理它和/或标记用户在下次登录时更新他们的电子邮件。

我使用的是 Ubuntu 和 Postfix。我已成功使用别名和虚拟别名实现了 VERP。因此退回的电子邮件的返回路径为[电子邮件保护],然后我可以将它们传送到脚本中。

现在我已经设置了 VERP,我知道原始电子邮件是发送给谁的,但我需要解析返回的邮件头来确定它是软退回还是硬退回。

处理这个问题的最佳方法是什么?据我所知,并非所有邮件服务器都遵循相同的规则,并且邮件头的格式也多种多样。是否有一些开源项目可以跟踪这些类型的信息?我可以实施一些简单的措施来正确分类大多数退回邮件?

我正在尝试保护我的邮件服务器的声誉,因此非常感谢任何帮助!

答案1

作为RFC3463解释,以 5 开头的状态代码用于永久性故障,以 4 开头的状态代码用于持续性瞬时故障。您可以依靠服务器日志并尝试以下操作,而不是尝试解析具有不同格式的几条消息:

grep " dsn=5." /var/log/mail.log | grep -o -P " to=<(.+?)>" | sort | uniq -c

这将从 mail.log(Postfix 格式)中查找永久性错误,并提供每个地址的地址和退回次数。您还可以使用“dsn=4.”获取带有临时错误的地址。

答案2

通常有两种类型的退回

  1. 退回邮件的原因直接的当你的 postfix 发送电子邮件时,远程邮件服务器被拒绝。
  2. 由远程服务器(后缀之后的下一跳服务器)引起的退回无法将消息传递给最终收件人。

第一个案例已经由很好的答案以上由 Esa Jokinen 撰写。最好的办法是解析邮件日志。

第二种情况是退回邮件的特殊情况。示例场景:

  • 您发送带有收件人的电子邮件[电子邮件保护]mail.example.com服务器。
  • 在 mail.example.com 中,[电子邮件保护]别名为[电子邮件保护]并必须转发至mail.example.net
  • 有一天mail.example.net拒绝你的消息mail.example.com必须将退回邮件发送到您的服务器。
  • 不幸的是,您服务器中的邮件日志将有“dsn=2”,因为mail.example.com已接受该消息但未能将其转发给mail.example.net

这是第二种类型的退回电子邮件的示例。雅虎邮件服务器有转发规则[电子邮件保护]->[电子邮件保护]。不幸的是,example.net 的邮件服务器拒绝了该邮件 :(

From MAILER-DAEMON  Thu Mar  5 05:07:26 2015
Return-Path: <>
X-Original-To: [email protected]
Delivered-To: [email protected]
Received: from nm21-vm7.bullet.mail.gq1.yahoo.com (nm21-vm7.bullet.mail.gq1.yahoo.com [98.136.217.54])
        (using TLSv1 with cipher ECDHE-RSA-AES128-SHA (128/128 bits))
        (No client certificate requested)
        by mx.example.org (Postfix) with ESMTPS id D6365565FC
        for <[email protected]>; Thu,  5 Mar 2015 05:07:25 +0700 (WIT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=bounce; t=1425506842; bh=zk/tWZNl6c36dmlPDmakM9ekK8cHVJANXMmSdsbkcWc=; h=From:To:Date:Subject:From:Subject; b=Im95h1qTg6qN3yUI7vF1fXtJ0SbUnzv8rUPwLbpNwxGPN2p8wfosXJzQgJ3nzr4L4ZQ50P2d9E9U4jEUNtnyi7nlFd5kKbtiVuda4H56h1PFnt+7wSpgHcd5Irs/lLODumb6ZZSEpCOWttcB9+JLaDfEUUPjGcbR+xww4XeH5Eo=
From: [email protected]
To: [email protected]
Date: Wed, 04 Mar 2015 22:07:22 -0000
Subject: Failure Notice
X-Yahoo-Newman-Property: bmbounce

Sorry, we were unable to deliver your message to the following address.

<[email protected]>:
Remote host said:
550 5.1.1 User unknown
 [RCPT_TO]

对于这种情况,您唯一的方法是解析退回邮件。不幸的是,没有标准的退回邮件格式,因此您必须解析邮件正文并确定导致拒绝的原因。

后缀反弹解析的功能清单:

  1. 检查 VERP 地址是否有效。您不想解析无效消息。
  2. 解析正文,确定是软拒绝还是硬拒绝。

对于第二个功能,你可以谷歌搜索一些常见的拒绝信息。例如反弹-正则表达式-列表.xml经过雅库布·利斯卡


Esa Jokinen 制作下面的评论中有一个很好的观点这两种退信类型。如果你的目标是保持服务器声誉,那么处理第一种退信类型就足够了。第二种退信是关于清理你的邮件列表。因此,死邮件应该被删除,从而释放一些您的服务器中的资源。

一些邮件列表管理器(例如 PHPlist 和 Mailman)也通过解析电子邮件正文来处理此退回问题,因为它们没有资源来解析邮件日志。

相关内容