使用 PHPMailer 发送邮件时无法在主题中发送表情符号
Can't send emojis in subject when sending mail with 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>";
邮件发送正常,被两个小火表情符号包围的单词 "text" 正确显示在电子邮件主题中。邮件正文也正确显示:
。如果我试试这个:
$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>";
再次正确显示主题和正文:
但如果我再添加一个 "text" 单词:
$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 个字节?)
发生了什么事?
如果只是一个提供商或另一个提供商,我会说是他们,但 两者 感觉不太可能。我敢打赌,它是发送端的某些东西,例如出站过滤器,它不正确地破坏了 header。虽然您可以为电子邮件的 body 指定字符集和编码,但 headers 必须 是 7-有点安全,所以如果你想使用更高级的字符集,它必须遵循 RFC1342.
中指定的格式
我敢打赌,出站邮件基础设施中有一些东西正在解码,然后错误地重新-编码主题header。我建议联系您的出站邮件服务管理员 and/or 通过其他提供商进行测试。
同时,您可以自己手动对主题行进行编码,因为 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));
}
我的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>";
邮件发送正常,被两个小火表情符号包围的单词 "text" 正确显示在电子邮件主题中。邮件正文也正确显示:
。如果我试试这个:
$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>";
再次正确显示主题和正文:
但如果我再添加一个 "text" 单词:
$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 个字节?)
发生了什么事?
如果只是一个提供商或另一个提供商,我会说是他们,但 两者 感觉不太可能。我敢打赌,它是发送端的某些东西,例如出站过滤器,它不正确地破坏了 header。虽然您可以为电子邮件的 body 指定字符集和编码,但 headers 必须 是 7-有点安全,所以如果你想使用更高级的字符集,它必须遵循 RFC1342.
中指定的格式我敢打赌,出站邮件基础设施中有一些东西正在解码,然后错误地重新-编码主题header。我建议联系您的出站邮件服务管理员 and/or 通过其他提供商进行测试。
同时,您可以自己手动对主题行进行编码,因为 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));
}