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


9

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

我只会向用户发送选择接收的电子邮件,但有时某些电子邮件地址会过时。当电子邮件退回我的服务器时,我想找到为什么退回(软/硬)。然后,我可以在数据库中对其进行适当处理和/或标记用户在下次登录时更新其电子邮件。

我正在使用Ubuntu和Postfix。我已经成功实现了具有别名和虚拟别名的VERP。因此,退回的电子邮件的返回路径为bounce+OrigEmailAddress@example.com,我可以将其通过管道传递到脚本。

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

处理此问题的最佳方法是什么?据我了解,并非所有邮件服务器都遵循相同的规则,并且标头可以具有多种格式。是否有一些开源项目可以跟踪这些类型的事情?我可以实现一些简单的方法,将大多数反弹正确分类吗?

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

Answers:


9

RFC3463所述,以5开头的状态码用于永久性故障,以4表示持续性瞬时故障。与其尝试解析几种不同格式的消息,不如依靠服务器日志并尝试如下操作:

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

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


谢谢Esa!我没有意识到postfix在邮件日志中有该信息。这是您使用的解决方案吗?您是否发现后缀对dsn = 5的硬跳进行了正确分类?我已经读到某些邮件服务器不符合RFC。因此,我认为可能需要更复杂的解决方案。您的经历如何?如果我们可以测试后缀以使其正确,则这似乎是一个不错的解决方案:-)
理查德(Richard)

真正有用的脚本-谢谢!此处是grep的-P标志的替代方案(适用于Mac用户等):unix.stackexchange.com/a/437694/275762 grep " dsn=5." /var/log/mail.log | pcregrep -o1 " to=<(.+?)>" | sort | uniq -c
Peter M.

8

通常有两种类型的跳动

  1. 当您的后缀传递电子邮件时,由直接拒绝远程邮件服务器引起的反弹。
  2. 远程服务器(后缀后为下一跳服务器)引起的退回无法将邮件传递给最终收件人。

上面的Esa Jokinen 的出色回答已经覆盖了第一个案例。最好的选择是解析maillog。

第二种情况是弹跳的特殊情况。示例场景:

  • 您将带有收件人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

在这里,第二种类型的示例退回电子邮件。有转发规则Yahoo邮件服务器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]

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

后缀跳动分析的功能清单:

  1. 检查VERP地址是否有效。您不想解析无效的消息。
  2. 解析身体,确定它们是软排斥还是硬排斥。

对于第二个功能,您可以在Google上搜索一些常见的拒绝消息。示例就是Jakub Liskabounce-regex-list.xml


Esa Jokinen 在以下有关这两种跳动类型的评论中指出一个好观点。如果您的目标是保持服务器信誉,那么处理第一个退回类型就足够了。第二次反弹是关于清理您的列表。因此,应该删除失效的电子邮件,从而释放服务器中的某些资源。

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


1
如果有必要还处理自动转发到另一个地址的邮件,则此解决方案很有用且更彻底。但是,如果目标是保护邮件服务器的信誉,则处理直接拒绝应该足够了。转发MTA的管理员应删除过时的转发和邮件列表(以保护其信誉并避免不必要的流量)。在那之后,我们又回到了第一种情况。如果二次弹跳量很大,OP应该使用此解决方案。哪个需要更少的精力。
Esa Jokinen 2015年

@masegaloeh,感谢您的信息!我什至没有考虑过这种转发情况!目前,我主要关心保护邮件服务器的代表,但是如果反弹增加,这可能会非常有用。
理查德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.