我编写了一个 WordPress 插件,它可以发送新的帖子通知。有一个设置可以将主题行从 html 实体转换为quoted-printable,因此它们将在任何电子邮件客户端上以 UTF-8 显示。几周前,我开始收到有关引用的可打印主题行保持原样而不是被解码的报告。
示例主题标题:
Subject: =?UTF-8?Q?[Pranamanasyoga]=20Foro=20Pranamanasyoga=20:=20estr?= =?UTF-8?Q?=C3=A9s=20y=20resilencia?=
我无法在本地复制它,也无法在记者之间找到任何共同点。
生成引用打印行的代码是这样的:
<?php
$enc = iconv_get_encoding( 'internal_encoding' ); // this is UTF-8
$preferences = ['input-charset' => $enc, 'output-charset' => "UTF-8", 'scheme' => 'Q' ];
$filtered_subject = '[Pranamanasyoga] Foro Pranamanasyoga : estrés y resilencia';
$encoded = iconv_mime_encode( 'Subject', html_entity_decode( $filtered_subject ), $preferences );
$encoded = substr( $encoded, strlen( 'Subject: ' ) );
如果我尝试解码它,它工作正常:
$decoded = iconv_mime_decode($encoded, 0, "UTF-8");
var_dump(['encoded' => $encoded, 'decoded' => $decoded])."\n";
结果:
array(2) {
["encoded"]=>
string(102) "=?UTF-8?Q?[Pranamanasyoga]=20Foro=20Pranamanasyoga=20:=20estr?=
=?UTF-8?Q?=C3=A9s=20y=20resilencia?="
["decoded"]=>
string(59) "[Pranamanasyoga] Foro Pranamanasyoga : estrés y resilencia"
}
我注意到但认为不相关的一件事是我的代码实际上在第二个=?UTF-8?Q?
部分之前添加了一个换行符并且电子邮件主题标题没有它。使用和不使用换行符解码字符串的工作方式相同。
是否有人对可能导致电子邮件客户端(包括 Gmail)按原样显示字符串而不是将其解码为 UTF-8 的原因有想法/建议?
PS 在写这篇文章时,我看到了一个mb_encode_mimeheader()
在不同线程中使用的建议。它似乎iconv_mime_decode()
在我的测试代码中运行良好,但输出字符串确实与原始字符串不同:
[Pranamanasyoga] Foro Pranamanasyoga : =?UTF-8?Q?estr=C3=A9s=20y=20resile?=
=?UTF-8?Q?ncia?=
是不是电子邮件客户更喜欢这种格式而不是原始格式?