主题字段中的 PHP 邮件特殊字符

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

关于如何使其正常工作的任何建议?谢谢。


答案 1

尝试主题:

$sub = '=?UTF-8?B?'.base64_encode($subject).'?=';

然后:

mail($to, $sub, $message, $headers);

答案 2

虽然接受的答案工作正常,但在查看原始标题时无法阅读主题。这是一个替代方案,可以保持行的可读性,如果它主要由ascii字符组成,则也更短。

$subject = '=?UTF-8?q?' . quoted_printable_encode($subject) . '?=';

以下是已接受答案的编码主题行:

=?UTF-8?B?4piFIFlvdXIgbmV3IGFjY291bnQ=?=

这是我的答案的编码主题行:

=?UTF-8?q?=E2=98=85 Your new account?=

编辑:

事实证明,根据RFC 2045的要求,它将长字符串拆分为最多75个字符的多行。结果是一个不能与 的参数一起使用的字符串。下面是解决此问题的更新版本。它还将避免对纯 ascii 主体进行编码。quoted_printable_encode()mail()$subject

/**
 * 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;
}

解释:

$subj = "Lorem ipsuöm dolor sit amet, consectetur adipiscing elit. Praesent mattis molestie purus, non semper lectus dictum eget.";

quoted_printable_encode

Lorem ipsu=C3=B6m dolor sit amet, consectetur adipiscing elit. Praesent mat=
tis molestie purus, non semper lectus dictum eget.

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.?=

推荐