电子邮件客户端无法解码带引号的可打印电子邮件主题行

问题描述

我写了一个wordpress插件,可以发送新的帖子通知。有一个设置可以将主题行从html实体转换为带引号的可打印内容,这样它们就可以在任何电子邮件客户端上以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&eacute;s y resilencia';

$encoded = iconv_mime_encode( 'Subject',html_entity_decode( $filtered_subject ),$preferences );
$encoded = substr( $encoded,strlen( 'Subject: ' ) );

如果我尝试对其进行解码,则效果很好:

$decoded = iconv_mime_decode($encoded,"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的想法/建议吗?

P.S。在撰写本文时,我看到了在不同线程中使用mb_encode_mimeheader()的建议。在我的测试代码中,iconv_mime_decode()似乎可以很好地工作,但是输出字符串确实与原始字符串不同:

[Pranamanasyoga] Foro Pranamanasyoga : =?UTF-8?Q?estr=C3=A9s=20y=20resile?=
 =?UTF-8?Q?ncia?=

难道是电子邮件客户端会比原始格式更喜欢这种格式吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)