繁体   English   中英

使用 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);

然后,如果我尝试将 email 发送到我的 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>";

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

在此处输入图像描述

. 如果我试试这个:

$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 个字节?)

怎么了?

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

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

同时,您可以自己手动编码主题行,因为 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));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM