使用 PHPMailer 发送邮件时无法在主题中发送表情符号

我的 PHPMailer 相关选项配置如下:


$mailer = new PHPMailer();

$mailer->IsSMTP();

$mailer->SMTPAuth = true;

$mailer->CharSet = "UTF-8";

$mailer->isHTML(true);

然后,如果我尝试向我的 hotmail.com 帐户发送一封电子邮件,在主题字段中使用一些表情符号,如下所示:


$foo = "\xF0\x9F\x94\xA5 text \xF0\x9F\x94\xA5";

$mail->Subject = $foo;

$mail->Body = "<p style='font-size:100px'>Mail body: $foo</p>";

邮件发送正常,邮件主题中正确显示了被两个小火表情符号包围的“文本”一词。邮件正文也正确显示:

http://img3.mukewang.com/643a62cb0001750a02230039.jpg

如果我试试这个:


$foo = "\xF0\x9F\x94\xA5 text text \xF0\x9F\x94\xA5";

$mail->Subject = $foo;

$mail->Body = "<p style='font-size:100px'>Mail body: $foo</p>";

主题和正文再次正确显示:

http://img1.mukewang.com/643a62d80001bab202620046.jpg

但如果我添加另一个“文本”字样:


$foo = "\xF0\x9F\x94\xA5 text text text \xF0\x9F\x94\xA5";

$mail->Subject = $foo;

$mail->Body = "<p style='font-size:100px'>Mail body: $foo</p>";

然后会发生这种情况:

http://img4.mukewang.com/643a62e60001085704010043.jpg

所以主题表情符号被替换为每个 4 个问号(可能是包含表情符号 unicode 字符的 4 个字节?)

怎么了?


慕的地10843
浏览 58回答 1
1回答

喵喔喔

如果只是一个提供商或另一个提供商,我会说是他们,但两者都不太可能。我敢打赌,这是发送端的某些东西,例如出站过滤器,它不正确地破坏了标头。虽然您可以为电子邮件正文指定字符集和编码,但标头必须是 7 位安全的,因此如果您想使用更高级的字符集,它必须遵循RFC1342中指定的格式。我敢打赌,出站邮件基础设施中有一些东西正在解码,然后错误地重新编码主题标题。我建议联系您的出站邮件服务管理员和/或通过其他提供商进行测试。同时,您可以自己手动对主题行进行编码,因为 PHPMailer 代码不应启动,除非它检测到非 7 位安全字符。例如:function encode_subject($subject, $charset, $force=false) {&nbsp; &nbsp; if( !$force && $subject === quoted_printable_encode($subject) ) {&nbsp; &nbsp; &nbsp; &nbsp; return $subject;&nbsp; &nbsp; }&nbsp; &nbsp; return sprintf('=?%s?Q?%s?=', $charset, quoted_printable_encode($subject));}
打开App,查看更多内容
随时随地看视频慕课网APP