parsing未传送的邮件标题(退回邮件)

什么是parsing返回到我的服务器反弹(无法投递)电子邮件的标题,并确定是否软或反弹的最佳方式是什么?

我只发送给我的用户select邮件,但偶尔有些电子邮件地址陈旧。 当电子邮件弹回到我的服务器,我想find为什么它弹起(软/硬)。 然后,我可以在我的数据库中正确处理它,并且/或者标记用户在下次login时更新他们的电子邮件。

我使用的是Ubuntu和Postfix。 我已经用别名和虚拟别名成功实现了VERP。 所以退回的电子邮件有一个bounce + OrigEmailAddress@example.com返回path,我可以pipe他们到一个脚本。

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

处理这个问题的最好方法是什么? 据我了解,并不是所有的邮件服务器都按照相同的规则来播放,而且邮件头可以有多种格式。 是否有一些开源项目跟踪这些types的东西? 我可以实现一些简单的东西,将正确的大部分反弹归类?

我试图保护我的邮件服务器的声誉,所以任何帮助非常感谢!

正如RFC3463所解释的那样,从5开始的状态码用于永久性故障,而4用于持续性瞬态故障。 不要试图用不同的格式来分析几条消息,你可以依靠服务器日志来尝试这样的事情:

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

这将从mail.log(Postfix格式)中find永久性错误,并给出每个地址的地址和popup量。 您也可以使用“dsn = 4”。 得到临时错误的地址。

一般有两种types的反弹

  1. 当你的postfix发送邮件时, 直接拒绝远程邮件服务器引起的反弹。
  2. 远程服务器(后缀为后缀服务器)导致的反弹无法将邮件传递给最终收件人。

上面的第一个案例已经被Esa Jokinen的优秀回答覆盖了。 你最好的select是parsingmaillog。

第二起案件是反弹的特例。 示例场景:

  • 您将收件人fakemail@example.com电子邮件发送到mail.example.com服务器。
  • 在mail.example.com中, fakemail@example.com被别名为realmail@example.net ,必须转发到mail.example.net
  • 有一天mail.example.net拒绝你的信息,所以mail.example.com必须发送到你的服务器。
  • 不幸的是你的服务器中的maillog将有“dsn = 2”,因为mail.example.com已经接受了这个消息,但是没有把它转发到mail.example.net

这里的第二种types的例子反弹电子邮件。 有转发规则雅虎邮件服务器myuser@yahoo.com – > myuser@example.net 。 不幸的是,example.net的邮件服务器拒绝邮件:(

 From MAILER-DAEMON Thu Mar 5 05:07:26 2015 Return-Path: <> X-Original-To: noreply-myuser=yahoo.com@example.org Delivered-To: noreply-263462085117-1425506829-myuser=yahoo.com@example.org 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 <noreply-263462085117-1425506829-myuser=yahoo.com@example.org>; 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: MAILER-DAEMON@yahoo.com To: noreply-263462085117-1425506829-myuser=yahoo.com@example.org 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. <myuser@example.net>: Remote host said: 550 5.1.1 User unknown [RCPT_TO] 

对于这种情况,您唯一的方法是parsing反弹消息。 不幸的是,没有标准的反弹格式,所以你必须parsing身体,并确定造成的拒绝。

你的postfix反弹parsingfunction清单:

  1. 检查VERP地址是否有效。 你不想分析无效的消息。
  2. parsing身体,确定是否软或硬排斥。

对于第二个function,你可以谷歌一些常见的拒绝信息。 这个例子是Jakub Liska的这个bounce-regex-list.xml 。


Esa Jokinen 在下面关于这两种反弹types的评论中提出了一个很好的观点 。 如果你的目标是保持服务器的声誉,那么处理第一个反弹types应该是足够的。 第二次反弹是关于清理你的名单。 所以死掉的电子邮件应该被删除,从而释放服务器中的一些资源。

一些邮件列表pipe理者,如PHPlist和Mailman,也解决了这个反弹问题,parsing邮件正文,因为他们没有资源parsingmaillog。