我是否在 PHP 中正确解码包含 VERP 编码地址的引用可打印退回邮件


Am I decoding quoted printable bounce messages containing a VERP-encoded addresses correctly in PHP?

感谢SO,我能够避免编写自己的函数来解码引用的可打印电子邮件,而是使用PHP的decode_quoted_printable()函数,从而节省了一些时间。

但是,我很快就遇到了一个问题。我有一封退回通知电子邮件,我需要对其进行解码并显示在浏览器中,电子邮件正文包含原始电子邮件标头,其中包括原始源地址,该地址经过 VERP 编码,以便我可以将退回邮件与数据库中的相应用户相关联。

退回邮件通知电子邮件的正文包含以下代码段:

------ This is a copy of the message, including all the headers. ------
Return-path: <blah+user=af.com@mydomain.com>

问题是quoted_printable_decode()使用"="字符作为特殊字符来指示它可能必须执行一些特殊解码。在"=af"(''x3D6166)的情况下,它决定将其转换为''xAF,这是马克龙字符的Unicode代码点。当我稍后运行此内容时htmlentities()它被转换为 Macron 字符的相应 HTML 代码,因此我最终在浏览器中得到以下输出:

返回路径:<等等+用户>

当然,并非所有以"="开头的序列都会发生这种情况,只有PHP认为可以转换为有意义的Unicode代码点的序列才会发生这种情况。替代imap_qprint()表现出相同的行为。

哦,我正在运行PHP 5.3.8。

我做错了什么,还是这就是quoted_printable_decode()应该的工作方式?

经过更多的研究,我意识到编码电子邮件中仅有的两个转义序列是每行末尾的等号,用于标识换行被删除的位置和"=3D"表示真正的等号应该在哪里。

所以我只是用这个单行词替换了对quoted_printable_decode()的调用:

$decoded_body = str_replace( array( "='n", '=3D' ), array( '', '=' ), $email_body );

我意识到这不会处理理论上可能出现在电子邮件中的任何 Unicode 数据,但鉴于我正在控制反弹的消息的内容,我几乎可以保证它们不会。因此,如果您决定自己使用此解决方案,请记住这一点。