PHP,SMTP - 电子邮件中的主题将国际字符显示为HTML_Entities

时间:2011-01-18 17:29:06

标签: php email utf-8 smtp encode

我已经花了半天多的时间 - 只是想让电子邮件主题看起来正常。但是当电子邮件登陆收件箱时,国际字符显示为HTML_Entities。

例如:TydzieńoJedność

显示为:Tydzień o Jedność

我已经为UTF-8的电子邮件编码:

$this->subject = "=?UTF-8?B?" . base64_encode($this->subject) . "?=";

当我收到电子邮件(Gmail)时,标题显示为:

Subject: =?UTF-8?B?VHlkemllJiMzMjQ7IG8gSmVkbm8mIzM0NzsmIzI2Mzs=?=

所以它似乎正确编码。但由于某种原因,Gmail仍会显示带有HTML_Entities的主题。

有什么想法吗?

请参阅代码:SMTP mail class

3 个答案:

答案 0 :(得分:2)

$this->subject是否是有效的UTF-8字符串?您使用的是UTF-8编码的.php文件(无BOM)吗?

另外,尝试:

$this->subject = "=?UTF-8?B?" . base64_encode(html_entity_decode($this->subject, ENT_COMPAT, 'UTF-8')) . "?=";

答案 1 :(得分:2)

如果是我,我会用

编码字符串
$this->subject = mb_encode_mimeheader($this->subject);

使用TydzieńoJedność的示例字符串,这会产生编码输出

=?UTF-8?B?VHlkemllw4XChCBvIEplZG5vw4XCm8OEwoc=?=

您在问题中提供的主题标题解码为包含HTML实体:

echo mb_decode_mimeheader('=?UTF-8?B?VHlkemllJiMzMjQ7IG8gSmVkbm8mIzM0NzsmIzI2Mzs=?=');

给出字符串Tydzień o Jedność。据推测,该字符串在base64编码之前已经过HTML编码。

答案 2 :(得分:1)

如果您有iconv可用,则可以尝试使用iconv_mime_encode()功能代替"=?UTF-8?B?" . base64_encode($this->subject) . "?=";