Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
主题字段中的PHP邮件特殊字符_Php_Email_Character Encoding_Special Characters - Fatal编程技术网

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

主题字段中的PHP邮件特殊字符,php,email,character-encoding,special-characters,Php,Email,Character Encoding,Special Characters,我想在使用PHP mail()函数发送的HTML电子邮件主题中插入特殊字符 我希望我的主题看起来像这样: ★ 您的新帐户 我尝试过使用HTML实体,如&starf(★)或直接在我的代码中粘贴符号,但除少数电子邮件客户端外,这也不起作用 $to = 'me@example.com'; $subject = '★ Your new account or ★ Your new account'; $message = 'HTML message...'; $heade

我想在使用PHP mail()函数发送的HTML电子邮件主题中插入特殊字符

我希望我的主题看起来像这样:

★ 您的新帐户

我尝试过使用HTML实体,如
&starf(★)或直接在我的代码中粘贴符号,但除少数电子邮件客户端外,这也不起作用

$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);
$to='1!'me@example.com';
$subject=★ 您的新帐户或&starf;您的新帐户';
$message='HTML message…';
$headers='MIME版本:1.0'。“\r\n”;
$headers.='内容类型:文本/html;字符集=utf-8'。“\r\n”;
$headers.='From:Me'。“\r\n”;
邮件($to、$subject、$message、$headers);
关于如何让它正常工作有什么建议吗? 谢谢。

尝试主题:

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

mail($to, $sub, $message, $headers);
$headers=”“;
$message=utf8\u编码($message);
$message=wordwrap($message,70,“\r\n”);
$subject='=?UTF-8?B?'。base64_编码(utf8_编码($subject))。?=';
$to_name='=?UTF-8?B?'。base64_编码(utf8_编码($to_name))。?=';
$from_name='=?UTF-8?B?'。base64_编码(utf8_编码($from_name))。?=';
$headers.=“MIME版本:1.0”。“\r\n”;
$headers.=“内容类型:文本/普通;字符集=utf-8”。“\r\n”;
//$headers.=“内容传输编码:引用可打印”。“\r\n”;
$headers.=“From:$From_name”。“\r\n”;
$headers.=“To:$To_name”。“\r\n”;
$headers.=“主题:$Subject”。“\r\n”;
$headers.=“X-Mailer:PHP/”。phpversion();
邮件(“,$subject,$message,$headers);

虽然接受的答案很好,但在查看原始标题时却无法阅读主题。这里有一个替代方案,它可以保持行的可读性,如果它主要由ascii字符组成,那么它也会更短

$subject = '=?UTF-8?q?' . quoted_printable_encode($subject) . '?=';
以下是已接受答案的编码主题行:

=?UTF-8?B?4piFIFlvdXIgbmV3IGFjY291bnQ=?=
以下是我答案的主题行:

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

$subj = "Lorem ipsuöm dolor sit amet, consectetur adipiscing elit. Praesent mattis molestie purus, non semper lectus dictum eget.";
根据RFC 2045的要求,
quoted\u printable\u encode()
将长字符串拆分为最多75个字符的多行。这是一个不能与
mail()
$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;
}
说明:

$subj = "Lorem ipsuöm dolor sit amet, consectetur adipiscing elit. Praesent mattis molestie purus, non semper lectus dictum eget.";
quoted\u printable\u encode之后

Lorem ipsu=C3=B6m dolor sit amet, consectetur adipiscing elit. Praesent mat=
tis molestie purus, non semper lectus dictum eget.
str\u替换后

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

已测试,它与符号一起工作,而不是与HTML实体一起工作。谢谢。我可以确认这对瑞典文字(Å,Ä,Ö)是唯一有效的。很不错的。我在headers arrayWorks的from字段中也使用了德语字符:Ä,ä,Ö,ö,Ü,ü,ß。谢谢虽然这个代码片段可以解决这个问题,但它确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,而这些人可能不知道您的代码建议的原因。请注意,
quoted\u printable\u encode()
,它实现了RFC2045中电子邮件正文的引用可打印编码和RFC2047中标题所需的引用可打印编码。特别是,对于标题,空格必须替换为
\uu
,而
\u
必须编码为
=5F
。此外,RFC2047限制了行长度,但禁止一行编码文本跨越多行。可能会有更多的差异,但最好只实现您自己的quoted printable,而不是使用
quoted\u printable\u encode
函数。一个更正是,空格必须编码为
\u
=20
,后者似乎更常见(但前者允许可读性IIUC)。