0

多亏了 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,这是 Macron 字符的 Unicode 代码点。当我稍后运行它时,htmlentities()它会转换为 Macron 字符的适当 HTML 代码,所以我最终在浏览器中得到以下输出:

返回路径:<blah+user¯.com@mydomain.com>

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

哦,我正在运行 PHP 5.3.8。

我做错了什么还是这只是quoted_printable_decode()应该如何工作?

4

1 回答 1

0

经过更多研究后,我意识到编码电子邮件中仅有的两个转义序列是每行末尾的等号,以标识已删除换行符的位置,而“= 3D”表示应该在哪里真正的等号.

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

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

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

于 2013-09-19T21:52:30.607 回答