23

我需要使用 PHP 进行一些退回的邮件处理。浏览电子邮件是没有问题的,但是投入资源编写我们自己的库来解析退回的电子邮件是非常不可取的。

我发现有 3 个 PHP 解决方案应该用于处理退回的邮件,但据我所见,它们都已经过时并且不再维护。(PHPList, PHPMailer-BMH, Bounce Handler @ PHPClasses.org)

有谁知道处理退回电子邮件的最新规则集?我不一定需要任何处理逻辑,即使只是一个最新的规则集也会令人满意。

感谢您的任何帮助。

4

6 回答 6

28

弹跳处理非常重要,因为您需要处理许多不同的服务器和响应。这包括那些由于您的电子邮件/主机/IP 已被列入黑名单/垃圾邮件评分而配置错误和退回的服务器。由于“不在办公室”的自动回复,有大量的退回。

我知道的一个简单解决方案是将自己的标头放入标识接收方地址和具体发送(令牌)的消息中。当它反弹时,可以基于此验证反弹。

另一种解决方案是将附加信息编码到发件人地址中,并相应地对其进行解析以进行退回。为此,您需要了解电子邮件的工作原理,如果您需要退回邮件,这通常很有用。

SO上有一些很好的答案(但我还没有找到这个答案),它涉及到这个主题的许多细节。如果我找到它,我会添加它。

一般的观点是,我不知道许多基于 PHP 的工具来处理退回邮件,我知道 PHPList(用于邮件列表处理的 PHP 组件)在他们的存储库中有一些东西:

编辑:具有非常丰富的答案的相关问题是:

编辑:不多,只是一些链接:

我想知道为什么电子邮件退回没有标准可以让您轻松识别退回和退回原因 - 或者是否存在?(如 RFC)

RFC3834 - 自动响应电子邮件的建议,RFC5436 筛子通知机制更新: mailto

退回邮件也在RFC5321 简单邮件传输协议中进行了部分讨论,它清楚地给出了一个原因,即如果无法传递邮件,MTA 必须报告回来。

主要问题是在 SMTP 中无法验证退回地址(发件人),因此发送退回邮件会带来可能发给错误的人(Backscatter Spam)的问题。

因此,一个可靠的邮件程序不仅会检查退回邮件,还会使用 SMTP 做更多工作以获得一定的质量水平,请参阅:

未交付报告的整个 Wikipedia 页面可能对第一次查看图片很感兴趣。

于 2011-11-21T09:18:32.110 回答
14

这是我以前做过的一次。它可以一致地捕获至少 70% 以上的退回邮件。

在发送的电子邮件中,放入一个自定义标题(如“x-email-check-id”),为每封发送的电子邮件提供一个唯一的标识符(可能为每封电子邮件创建一个 GUID 并将其存储在数据库中)

在服务器端,编写一个 cron 作业,定期从退回地址下载电子邮件,并在回复消息中查找此标头。这样,您可以将退回的邮件与发出的电子邮件相匹配。这样,您就可以确定这封电子邮件是从您的发送中退回的,而不是垃圾邮件。

之后,在电子邮件内容中搜索特定关键字以确定退回的原因。随着较新的电子邮件服务器返回不同的文本,应经常更新此关键字列表。但这是我使用的列表。

$Email__Full[] = 'databytes limit';
$Email__Full[] = 'exceeded dropfile size';
$Email__Full[] = 'exceeded email quota';
$Email__Full[] = 'exceeded storage';
$Email__Full[] = 'exceeding receiving limits';
$Email__Full[] = 'exceeds the maximum size';
$Email__Full[] = 'folder is full';
$Email__Full[] = 'mail system full';
$Email__Full[] = 'mailbox exceeds allowed size';
$Email__Full[] = 'mailbox full';
$Email__Full[] = 'mailbox has exceeded the limit';
$Email__Full[] = 'mailbox is full';
$Email__Full[] = 'mail box full';
$Email__Full[] = 'out of disk space';
$Email__Full[] = 'out of diskspace';
$Email__Full[] = 'over disk quota';
$Email__Full[] = 'over quota';
$Email__Full[] = 'over the allowed quota';
$Email__Full[] = 'problem with the recipient\'s mailbox';
$Email__Full[] = 'quota exceeded';
$Email__Full[] = 'quota violation';
$Email__Full[] = 'space has been used up';
$Email__Full[] = 'space not enough';
$Email__Full[] = 'status: 5.2.1';
$Email__Full[] = 'status: 5.2.2';
$Email__Full[] = 'status: 5.2.3';
$Email__Full[] = 'status: 5.3.3';

$Email__NotExist[] = '/var/mail/nobody';
$Email__NotExist[] = '550 5.1.1';
$Email__NotExist[] = 'account expired';
$Email__NotExist[] = 'account inactive';
$Email__NotExist[] = 'account suspended';
$Email__NotExist[] = 'address is administratively disabled';
$Email__NotExist[] = 'address is not recognized';
$Email__NotExist[] = 'address is rejected';
$Email__NotExist[] = 'address not recognized';
$Email__NotExist[] = 'address rejected';
$Email__NotExist[] = 'bad destination email address';
$Email__NotExist[] = 'cname lookup failed';
$Email__NotExist[] = 'connection refused';
$Email__NotExist[] = 'couldn\'t find any host';
$Email__NotExist[] = 'could not be found';
$Email__NotExist[] = 'deactivated mailbox';
$Email__NotExist[] = 'delivery time expired';
$Email__NotExist[] = 'destination server not responding';
$Email__NotExist[] = 'disabled or discontinued';
$Email__NotExist[] = 'does not exist';
$Email__NotExist[] = 'does not like recipient';
$Email__NotExist[] = 'doesn\'t have a yahoo.com account';
$Email__NotExist[] = 'doesn\'t have a yahoo.com.sg account';
$Email__NotExist[] = 'domain is for sale';
$Email__NotExist[] = 'find a mail exchanger';
$Email__NotExist[] = 'find any host named';
$Email__NotExist[] = 'following address(es) failed';
$Email__NotExist[] = 'host unknown';
$Email__NotExist[] = 'i couldn\'t find any host by that name';
$Email__NotExist[] = 'illegal user';
$Email__NotExist[] = 'in the queue too long';
$Email__NotExist[] = 'inactive recipient';
$Email__NotExist[] = 'inactive user';
$Email__NotExist[] = 'incorrectly addressed';
$Email__NotExist[] = 'invalid recipient';
$Email__NotExist[] = 'invalid user';
$Email__NotExist[] = 'isn\'t in my control/locals file';
$Email__NotExist[] = 'mailbox not available';
$Email__NotExist[] = 'mailbox not found';
$Email__NotExist[] = 'mailbox unavailable';
$Email__NotExist[] = 'mail is looping';
$Email__NotExist[] = 'message is looping';
$Email__NotExist[] = 'name is not recognized';
$Email__NotExist[] = 'name not found';
$Email__NotExist[] = 'name not recognized';
$Email__NotExist[] = 'no local mailbox';
$Email__NotExist[] = 'no longer accepts mail';
$Email__NotExist[] = 'no longer an employee';
$Email__NotExist[] = 'no longer on server';
$Email__NotExist[] = 'no longer valid';
$Email__NotExist[] = 'no mailbox';
$Email__NotExist[] = 'no route found to domain';
$Email__NotExist[] = 'no such user';
$Email__NotExist[] = 'none of the mail servers for the destination domain has so far responded';
$Email__NotExist[] = 'no valid host';
$Email__NotExist[] = 'no valid recipients';
$Email__NotExist[] = 'not a valid mailbox';
$Email__NotExist[] = 'not listed';
$Email__NotExist[] = 'not listed in domino';
$Email__NotExist[] = 'possible mail loop';
$Email__NotExist[] = 'recipient cannot be verified';
$Email__NotExist[] = 'recipient unknown';
$Email__NotExist[] = 'recipients are invalid';
$Email__NotExist[] = 'recipnotfound';
$Email__NotExist[] = 'relaying denied';
$Email__NotExist[] = 'several matches found in domino';
$Email__NotExist[] = 'status: 5.1.1';
$Email__NotExist[] = 'status: 5.1.3';
$Email__NotExist[] = 'status: 5.1.4';
$Email__NotExist[] = 'status: 5.1.6';
$Email__NotExist[] = 'status: 5.1.7';
$Email__NotExist[] = 'this user doesn\'t have a yahoo';
$Email__NotExist[] = 'too many hops';
$Email__NotExist[] = 'unable to deliver';
$Email__NotExist[] = 'unable to relay';
$Email__NotExist[] = 'unknown address';
$Email__NotExist[] = 'unknown recipient';
$Email__NotExist[] = 'unknown user';
$Email__NotExist[] = 'unrouteable address';
$Email__NotExist[] = 'user doesn\'t have';
$Email__NotExist[] = 'user unknown';
$Email__NotExist[] = 'x-notes; 550 5.1.1';
$Email__NotExist[] = 'x-notes; recipient\'s domino directory';
$Email__NotExist[] = '$B%G%#%l%/%H%j$K$O8+$D$+$j$^$;$s!#'; //* Returned from japanese domino . Somehow means directory is not found.

$Email__Banned[] = '_spam_';
$Email__Banned[] = '550 5.7.1';
$Email__Banned[] = '550 access denied';
$Email__Banned[] = '550 no thanks';
$Email__Banned[] = '550 spam';
$Email__Banned[] = '554 5.7.0';
$Email__Banned[] = '554 5.7.1';
$Email__Banned[] = '554 denied';
$Email__Banned[] = '554 message does not conform to standards';
$Email__Banned[] = '554 message refused';
$Email__Banned[] = '571 message Refused';
$Email__Banned[] = 'activated my anti-spam features';
$Email__Banned[] = 'administrative prohibition';
$Email__Banned[] = 'appears to contain uce/spam';
$Email__Banned[] = 'appears to be spam';
$Email__Banned[] = 'appears to be unsolicited';
$Email__Banned[] = 'banned for spamming';
$Email__Banned[] = 'blackholed by uribl.com';
$Email__Banned[] = 'blacklisted by surbl';
$Email__Banned[] = 'blocked by filter';
$Email__Banned[] = 'blocked by kbas system';
$Email__Banned[] = 'blocked by our content filter';
$Email__Banned[] = 'blocked by spamsssassin';
$Email__Banned[] = 'blocked by the recipient';
$Email__Banned[] = 'blocked by user\'s personal blacklist';
$Email__Banned[] = 'blocked due to spam like qualities';
$Email__Banned[] = 'blocked using spam pattern';
$Email__Banned[] = 'blocked using uceprotect';
$Email__Banned[] = 'body part contains disallowed string';
$Email__Banned[] = 'classified as **spam**';
$Email__Banned[] = 'content blacklist';
$Email__Banned[] = 'content filter rejected the message';
$Email__Banned[] = 'consider the message to be spam';
$Email__Banned[] = 'considered spam';
$Email__Banned[] = 'contains spam';
$Email__Banned[] = 'content filter rejection';
$Email__Banned[] = 'content rejected';
$Email__Banned[] = 'denied by policy';
$Email__Banned[] = 'detected your message as spam';
$Email__Banned[] = 'does not accept UCE';
$Email__Banned[] = 'domain is banned';
$Email__Banned[] = 'email abuse detected';
$Email__Banned[] = 'error 553';
$Email__Banned[] = 'help_spam_16.htm';
$Email__Banned[] = 'high on spam scale';
$Email__Banned[] = 'http://www.google.com/mail/help/bulk_mail.html';
$Email__Banned[] = 'http://www.surbl.org/lists.html';
$Email__Banned[] = 'identified as spam';
$Email__Banned[] = 'identified your message as spam';
$Email__Banned[] = 'listed in multi.surbl.org';
$Email__Banned[] = 'looks like spam';
$Email__Banned[] = 'mail rejected by windows live hotmail for policy reasons';
$Email__Banned[] = 'message bounced by administrator';
$Email__Banned[] = 'message content rejected, ube';
$Email__Banned[] = 'message contains a virus or other harmful content';
$Email__Banned[] = 'message has too high spam probability';
$Email__Banned[] = 'message is blacklisted';
$Email__Banned[] = 'message refused';
$Email__Banned[] = 'no spam here';
$Email__Banned[] = 'not accepted here';
$Email__Banned[] = 'not in the whitelist';
$Email__Banned[] = 'not rfc compliant';
$Email__Banned[] = 'permanently rejected message';
$Email__Banned[] = 'policy violation';
$Email__Banned[] = 'refused mail service';
$Email__Banned[] = 'reject spam mail';
$Email__Banned[] = 'reject the mail';
$Email__Banned[] = 'rejected by filter';
$Email__Banned[] = 'rejected as spam';
$Email__Banned[] = 'rejected by 35 antiSpam system';
$Email__Banned[] = 'rejected by antispam system';
$Email__Banned[] = 'rejected by cloudmark anti-spam';
$Email__Banned[] = 'rejected by our Spam Filter';
$Email__Banned[] = 'rejected by spam filtering';
$Email__Banned[] = 'rejected by surbl';
$Email__Banned[] = 'rejected by the anti-spam system';
$Email__Banned[] = 'rejected due to security policies';
$Email__Banned[] = 'rejected for policy reasons';
$Email__Banned[] = 'rejected for spam';
$Email__Banned[] = 'requires that you verify';
$Email__Banned[] = 'scored as spam';
$Email__Banned[] = 'sender address verification';
$Email__Banned[] = 'sender was rejected';
$Email__Banned[] = 'spam detected by spamassassin';
$Email__Banned[] = 'spam filter pattern';
$Email__Banned[] = 'spam-like characteristics';
$Email__Banned[] = 'spam mail detected';
$Email__Banned[] = 'spam mail refused';
$Email__Banned[] = 'spam message was blocked';
$Email__Banned[] = 'spam rejected';
$Email__Banned[] = 'spam score too high';
$Email__Banned[] = 'status: 5.7.1';
$Email__Banned[] = 'support.proofpoint.com';
$Email__Banned[] = 'suspected spam';
$Email__Banned[] = 'suspicious url in message body';
$Email__Banned[] = 'temporarily deferred';
$Email__Banned[] = 'transaction failed';
$Email__Banned[] = 'unacceptable content';
$Email__Banned[] = 'unacceptable mail content';
$Email__Banned[] = 'unsolicited bulk e-mail';
$Email__Banned[] = 'unsolicited bulk email';
$Email__Banned[] = 'unsolicited email is refused';
$Email__Banned[] = 'validate recipient email';
$Email__Banned[] = 'will be deleted from queue';

$Email__OutOffice[] = 'away for a vacation';
$Email__OutOffice[] = 'away from the office';
$Email__OutOffice[] = 'not in office';
$Email__OutOffice[] = 'on leave';
$Email__OutOffice[] = 'on vacation';
$Email__OutOffice[] = 'out of office';
$Email__OutOffice[] = 'out of the office';
于 2011-11-21T03:46:01.127 回答
2

在没有找到这个问题的简单答案后,我在 github 上找到了这个出色的解决方案:

https://github.com/cfortune/PHP-Bounce-Handler

于 2014-04-22T21:35:50.963 回答
2

自己写这个比你想象的要容易。

您只需在标题中设置反弹路径。然后设置该电子邮件地址以运行处理脚本。您显然需要发送某种形式的用户 ID。

我以前使用过 PHPList 并发现它很好,有更好的服务可以满足您的需求,但显然它们是有成本的。

当地址不存在或邮件服务器将其发回时,就会发生退回。一些邮件服务器不会回复(作为一项安全功能),因此准确性不会是最好的。

许多独立/库提供了额外的功能,可以确定哪些链接被点击以及谁阅读了电子邮件。ETC

这些事情很容易实现,但需要资源。

让我知道您是否还有其他需要帮助的地方

于 2011-11-19T19:29:30.233 回答
1

我是 ezComponents 库的忠实粉丝,它包括一个 Mail 组件,它可以处理发送和解析邮件(以及连接到您的 MTA 以检索它。http: //ezcomponents.org/docs/tutorials/Mail #邮件解析器

通读文档,似乎它应该取决于您的任务。

于 2011-04-07T13:50:27.017 回答
0

作为一名 15 年的在线社区老手,我知道用营利性商业解决方案来回答问题(回答者隶属于该解决方案)是一条很好的路线。所以我走了,走那条线。我会尽力具体解决这个问题。让我们从一个标准的免责声明开始......

免责声明:我是下面描述的服务中的一个原则。

但是投入资源编写我们自己的库来解析退回的电子邮件是非常不可取的。

是的,考虑到您编写或包含的库在您修改后的几天内可能被认为已过时,编写自己的库对大多数人来说并不好玩(但我们这些可怜的、扭曲的灵魂,无事可做)。

有谁知道处理退回电子邮件的最新规则集?我不一定需要任何处理逻辑,即使只是一个最新的规则集也会令人满意。

维护此类库非常耗时,并且一旦变得非常耗时,此类库通常要么被放弃要么很少更新。这通常是商业解决方案的诞生方式。

我是开源的忠实粉丝,毫无疑问,多年来我个人从中受益匪浅。对于阅读本文的绝大多数人来说,上述选项已经足够了,因为你们中的许多人能够自行开发所需的解决方案或修改可用工具以满足您的需求,并且有时间这样做。

然而,对于那些不想构建自己的应用程序、调试和故障排除、一致且经常更新电子邮件处理定义的人,InboxResponse.com 提供电子邮件退回处理作为 SAAS 解决方案。这是:

  • 经常和一致地更新
  • 非常适合那些只想要有用的东西的人
  • 可以在几分钟内集成到您目前使用的任何现有邮件系统中。
  • 支持投递跟踪、退回处理、多级软退回处理(暂时无法投递的电子邮件)、无限的邮件列表、统计信息、图表等。

可在以下 URL 获得免费试用:https ://inboxresponse.com/free-trial/

可能不是您正在寻找的东西(一个始终保持最新的开源库),但我认为您正在寻找的东西目前不可用。

希望对某人有所帮助!

于 2012-07-08T01:37:50.470 回答