为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕的地10843 2023-04-15 16:39:12
我的 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>";邮件发送正常,邮件主题中正确显示了被两个小火表情符号包围的“文本”一词。邮件正文也正确显示:如果我试试这个:$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>";主题和正文再次正确显示:但如果我添加另一个“文本”字样:$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>";然后会发生这种情况:所以主题表情符号被替换为每个 4 个问号(可能是包含表情符号 unicode 字符的 4 个字节?)怎么了?
查看完整描述

1 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

如果只是一个提供商或另一个提供商,我会说是他们,但两者都不太可能。我敢打赌,这是发送端的某些东西,例如出站过滤器,它不正确地破坏了标头。虽然您可以为电子邮件正文指定字符集和编码,但标头必须是 7 位安全的,因此如果您想使用更高级的字符集,它必须遵循RFC1342中指定的格式。


我敢打赌,出站邮件基础设施中有一些东西正在解码,然后错误地重新编码主题标题。我建议联系您的出站邮件服务管理员和/或通过其他提供商进行测试。


同时,您可以自己手动对主题行进行编码,因为 PHPMailer 代码不应启动,除非它检测到非 7 位安全字符。例如:


function encode_subject($subject, $charset, $force=false) {

    if( !$force && $subject === quoted_printable_encode($subject) ) {

        return $subject;

    }

    return sprintf('=?%s?Q?%s?=', $charset, quoted_printable_encode($subject));

}


查看完整回答
反对 回复 2023-04-15
  • 1 回答
  • 0 关注
  • 56 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信