PHP 无效 quoted-printable 序列,来自雅虎的格式错误的 q 编码
PHP Invalid quoted-printable sequence, malformed q encoding from Yahoo
我在从 Yahoo 帐户转发的电子邮件中发现 PHP 中的以下错误:
Notice: Unknown: Invalid quoted-printable sequence: =?UTF-8?Q?ck-off with Weekly Sale up to 90% off (errflg=3) in Unknown on line 0
我花了几个小时研究这个问题,并决定在没有雅虎参与的情况下,在电子邮件中向自己发送完全相同的输出字符串。正确解码的原始q-encoded文本:
=?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?=
格式错误的 q-encoded 来自 Yahoo 的文本:
=?UTF-8?Q?GOG_Forward =?UTF-8?Q?ck-off_with_Weekly_Sale_up_to_90%_off?=
解码后的正确字符串:
GOG Forward: Fw: A great Monday kick-off with Weekly Sale up to 90% off
Roundcube 设法解码了正常文本和格式错误的文本,但我不确定如何解码,而且 25 兆字节 有点难以挖掘,但我无法做到甚至可以确定他们在哪里解码主题 headers.
如何修复 Yahoo 格式错误的 q-encoding 版本?
<?php
//These fail:
echo imap_mime_header_decode($mail_message_headers['Subject']);
echo quoted_printable_decode($mail_message_headers['Subject']);
?>
为了澄清,imap_fetchstructure 页面澄清了编码值 4
是 Quoted-Printable
/ ENCQUOTEDPRINTABLE
。
新发展
事实证明,出于某种原因,Yahoo 为同一个 header 发送了两次 主题 ,一次格式错误,另一次则不是。这是来自 原始电子邮件 的 Subject
header:
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 的源代码来解码消息的解决方案。
我把代码和demo贴出来了:
- You can see it here
- 点击大播放按钮预览提取
- 转到代码选项卡以查看可用于项目的提取的 Roundcube 代码
因为你在示例中提到不使用 类,所以我从 rube_mime
, and a couple of things from rcube_charset
中提取了 Roundcube 的 decode_mime_string()
函数,例如 $aliases
、parse_charset()
和 convert()
.
就从 Yahoo 解码格式错误的文本而言:
=?UTF-8?Q?GOG_Forward =?UTF-8?Q?ck-off_with_Weekly_Sale_up_to_90%_off?=
进入这个:
GOG Forward: Fw: A great Monday kick-off with Weekly Sale up to 90% off
这是不可能的。那里没有足够的数据。例如,它缺少“A great Monday ki”。您有电子邮件地址的完整来源吗?
我在从 Yahoo 帐户转发的电子邮件中发现 PHP 中的以下错误:
Notice: Unknown: Invalid quoted-printable sequence: =?UTF-8?Q?ck-off with Weekly Sale up to 90% off (errflg=3) in Unknown on line 0
我花了几个小时研究这个问题,并决定在没有雅虎参与的情况下,在电子邮件中向自己发送完全相同的输出字符串。正确解码的原始q-encoded文本:
=?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?=
格式错误的 q-encoded 来自 Yahoo 的文本:
=?UTF-8?Q?GOG_Forward =?UTF-8?Q?ck-off_with_Weekly_Sale_up_to_90%_off?=
解码后的正确字符串:
GOG Forward: Fw: A great Monday kick-off with Weekly Sale up to 90% off
Roundcube 设法解码了正常文本和格式错误的文本,但我不确定如何解码,而且 25 兆字节 有点难以挖掘,但我无法做到甚至可以确定他们在哪里解码主题 headers.
如何修复 Yahoo 格式错误的 q-encoding 版本?
<?php
//These fail:
echo imap_mime_header_decode($mail_message_headers['Subject']);
echo quoted_printable_decode($mail_message_headers['Subject']);
?>
为了澄清,imap_fetchstructure 页面澄清了编码值 4
是 Quoted-Printable
/ ENCQUOTEDPRINTABLE
。
新发展
事实证明,出于某种原因,Yahoo 为同一个 header 发送了两次 主题 ,一次格式错误,另一次则不是。这是来自 原始电子邮件 的 Subject
header:
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 的源代码来解码消息的解决方案。
我把代码和demo贴出来了:
- You can see it here
- 点击大播放按钮预览提取
- 转到代码选项卡以查看可用于项目的提取的 Roundcube 代码
因为你在示例中提到不使用 类,所以我从 rube_mime
, and a couple of things from rcube_charset
中提取了 Roundcube 的 decode_mime_string()
函数,例如 $aliases
、parse_charset()
和 convert()
.
就从 Yahoo 解码格式错误的文本而言:
=?UTF-8?Q?GOG_Forward =?UTF-8?Q?ck-off_with_Weekly_Sale_up_to_90%_off?=
进入这个:
GOG Forward: Fw: A great Monday kick-off with Weekly Sale up to 90% off
这是不可能的。那里没有足够的数据。例如,它缺少“A great Monday ki”。您有电子邮件地址的完整来源吗?