MrU*_*own 10 php email character-encoding special-characters
我想在使用PHP mail()函数发送的HTML电子邮件主题中插入特殊字符.
我希望我的主题看起来像这样:
★您的新帐户
我尝试使用像★(★)这样的HTML实体,或者直接在我的代码中粘贴符号,但这也不起作用,除了少数电子邮件客户端.
$to = 'me@example.com';
$subject = '? Your new account or ★ Your new account';
$message = 'HTML message...';
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
$headers .= 'From: Me <me@example.com>' . "\r\n";
mail($to, $subject, $message, $headers);
Run Code Online (Sandbox Code Playgroud)
有关如何使其正常工作的任何建议?谢谢.
Lko*_*opo 34
尝试主题:
$sub = '=?UTF-8?B?'.base64_encode($subject).'?=';
Run Code Online (Sandbox Code Playgroud)
然后:
mail($to, $sub, $message, $headers);
Run Code Online (Sandbox Code Playgroud)
虽然接受的答案工作正常,但在查看原始标题时无法阅读主题。这是一种替代方法,可以使该行保持可读性,并且如果它主要由 ascii 字符组成,则该行也会更短。
$subject = '=?UTF-8?q?' . quoted_printable_encode($subject) . '?=';
Run Code Online (Sandbox Code Playgroud)
这是已接受答案的编码主题行:
=?UTF-8?B?4piFIFlvdXIgbmV3IGFjY291bnQ=?=
Run Code Online (Sandbox Code Playgroud)
这是我的答案的编码主题行:
=?UTF-8?q?=E2=98=85 Your new account?=
Run Code Online (Sandbox Code Playgroud)
编辑:
事实证明quoted_printable_encode(),按照 RFC 2045 的要求,将长字符串拆分为最多 75 个字符的多行。结果是一个不能与mail()'s$subject参数一起使用的字符串。这是一个更新版本来解决这个问题。它还将避免编码纯 ASCII 主题。
/**
* Make sure the subject is ASCII-clean
*
* @param string $subject Subject to encode
*
* @return string Encoded subject
*/
function getEncodedSubject(string $subject): string {
if (!preg_match('/[^\x20-\x7e]/', $subject)) {
// ascii-only subject, return as-is
return $subject;
}
// Subject is non-ascii, needs encoding
$encoded = quoted_printable_encode($subject);
$prefix = '=?UTF-8?q?';
$suffix = '?=';
return $prefix . str_replace("=\r\n", $suffix . "\r\n " . $prefix, $encoded) . $suffix;
}
Run Code Online (Sandbox Code Playgroud)
解释:
$subj = "Lorem ipsuöm dolor sit amet, consectetur adipiscing elit. Praesent mattis molestie purus, non semper lectus dictum eget.";
Run Code Online (Sandbox Code Playgroud)
后 quoted_printable_encode
Lorem ipsu=C3=B6m dolor sit amet, consectetur adipiscing elit. Praesent mat=
tis molestie purus, non semper lectus dictum eget.
Run Code Online (Sandbox Code Playgroud)
后 str_replace
=?UTF-8?q?Lorem ipsu=C3=B6m dolor sit amet, consectetur adipiscing elit. Praesent mat?=
=?UTF-8?q?tis molestie purus, non semper lectus dictum eget.?=
Run Code Online (Sandbox Code Playgroud)