php - 使用 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>";
邮件发送正常,并且被两个小火表情符号包围的“文本”一词正确显示在电子邮件主题中。邮件正文也正确显示:
. 如果我试试这个:
$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>";
然后会发生这种情况:
所以主题 emojis 被每个 4 个问号替换(可能是 4 个字节组成 emoji unicode 字符?)
怎么了?
解决方案
如果只是一个或另一个提供者,我会说是他们,但两者都不太可能。我敢打赌,这是发送端的某些东西,例如不正确地破坏标头的出站过滤器。虽然您可以为电子邮件正文指定字符集和编码,但标头必须是 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));
}
推荐阅读
- html - 当中间层具有指定高度时,在不透明度过渡期间不应用 TranslateZ
- database - 在 Flask 应用程序中使用具有不同角色的用户
- java - SelectOutPut (AnyLogic) 中代理类型的条件
- react-native - 防止在 React Navigation 堆栈屏幕中运行常见事件
- python - 在 python 中存储 head() 数据 | 熊猫
- sql-server - 如何提高 ADO 查找速度?
- sql - 从分组依据中删除列
- node.js - 唱歌后 MEVN 堆栈重定向到主页
- c# - 如何实现列表
C# 类中的属性? - c++ - Windows 10 - 使用 gtkmm-3.0 库和 g++ 的分段错误 [包括复制]