PHP无效的带引号的可打印序列,来自Yahoo

问题描述

我从Yahoo帐户转发的电子邮件中遇到了PHP中的以下错误

注意:未知:无效的带引号的可打印序列:=?UTF-8?Q?ck-off,每周销售最多可享受90%的折扣(errflg = 3),位于第0行的UnkNown

我已经花了几个小时研究这个问题,并决定在没有Yahoo参与的情况下通过电子邮件向自己发送完全相同的输出字符串。正确解码的原始q编码文本:

=?UTF-8?Q?GOG_Forward = 3A_Fw = 3A_ = F0 = 9F = 98 = 89_A_great_Monday_kick-?==?UTF-8?Q?off_with_Weekly_Sale_up_to_90 = 25_off?=

来自Yahoo的格式错误的q编码文本:

=?UTF-8?Q?GOG_Forward =?UTF-8?Q?ck-off_with_Weekly_Sale_up_to_90%_off?=

解码时正确的字符串:

GOG前进:周二:?出色的周一开球,每周销售可享受高达90%的折扣

Roundcube可以解码正常文本和格式错误的文本,尽管我不确定如何挖掘25兆字节的内容,但我甚至无法确定它们在哪里正在解码主题标头。

如何解决Yahoo格式错误的q编码版本?

<?PHP
//These fail:
echo imap_mime_header_decode($mail_message_headers['Subject']);
echo quoted_printable_decode($mail_message_headers['Subject']);
?>

为澄清起见,imap_fetchstructure页澄清了用于编码的值4Quoted-Printable / ENCQUOTEDPRINTABLE


新发展

事实证明,由于某种原因,雅虎针对同一标头发送主题两次一个标头格式错误,另一个标头格式错误。这是原始电子邮件中的Subject标头:

Subject: =?UTF-8?Q?GOG_Forward:_Fw:_=F0=9F=98=89_A_great_Monday_ki?=
 =?UTF-8?Q?ck-off_with_Weekly_Sale_up_to_90%_off?=
MIME-Version: 1.0

解决方法

我创建了一个使用Roundcube的源代码对消息进行解码的解决方案。

You can test it here(点击顶部的运行)

由于您在示例中提到不使用类,因此我从rube_mime中提取了Roundcube的decode_mime_string()函数,并从rcube_charset中提取了一些内容,例如$aliases,{{ 1}}和parse_charset()


就从Yahoo解码格式错误的文本而言:

=?UTF-8?Q?GOG_Forward =?UTF-8?Q?ck-off_with_Weekly_Sale_up_to_90%_off?=

对此:

GOG前进:周二:?出色的周一开球,每周销售可享受高达90%的折扣

不可能。那里没有足够的数据。例如,它缺少“?A great Monday ki”。您有电子邮件地址的完整来源吗?