我有一个相当简单的功能来发送电子邮件。 我开始实现电子邮件的翻译版本,并带有特殊字符,如é和ó。每当我在电子邮件的主题中有这些内容时,电子邮件就会因为我的爱好者造成BAD_HEADER错误而造成麻烦。
显然它不是8位编码,这首先是有意义的。但是,我无法在网上的任何地方找到任何指导或解释如何正确编码主题。
为了好玩,我尝试了é而不是é,当然问题已经解决了。但与此同时,电子邮件以é开头,而不是é。
这是我目前的脚本:
function sendEmail() {
// Build HTML version
ob_start();
include('emailhtml.php');
$msgHTML = ob_get_contents();
ob_end_clean();
// Build TXT version
ob_start();
include('email.php');
$msgTxt = ob_get_contents();
ob_end_clean();
// Subject & headers
$subject = "áéíóú";
$boundary = md5(uniqid(rand()));
$headers = array();
$headers[] = "MIME-Version: 1.0";
$headers[] = "Content-Type: multipart/alternative; boundary = ".$boundary;
$headers[] = "From: ".$from." <".$from_email.">";
$headers[] = "Reply-To: ".$reply2_email;
// Plain text version of message
$body = "--$boundary\r\n" .
"Content-Type: text/plain; charset=UTF-8\r\n" .
"Content-Transfer-Encoding: base64\r\n\r\n";
$body .= chunk_split(base64_encode($msgTxt));
// HTML version of message
$body .= "--$boundary\r\n" .
"Content-Type: text/html; charset=UTF-8\r\n" .
"Content-Transfer-Encoding: base64\r\n\r\n";
$body .= chunk_split(base64_encode($msgHTML));
$body .= "--$boundary--\r\n";
// BAM! Shoot it off...
mail($receiver, $subject, $body, implode("\r\n", $headers));
}
答案 0 :(得分:4)
编码邮件标题
Subject: header
如果包含ASCII
字符集之外的任何字符,则需要进行编码。
编码类型
您可以使用两种编码:Quoted Printable
或Base64
。内容áéíóú
的典型编码主题标题如下所示:
// Using Quoted Printable encoding:
Subject: =?ISO-8859-1?Q?=C3=A1=C3=A9=C3=AD=C3=B3=C3=BA?=
// Using Base64 encoding:
Subject: =?ISO-8859-1?B?w6HDqcOtw7PDug==?=
首选方式
如果您的PHP
是使用Multibyte String Functions编译的,则应使用mb_encode_mimeheader():
$subject = "áéíóú";
$encoded_subject = mb_encode_mimeheader($subject);
print $encoded_subject;
// output: =?UTF-8?B?w4PCocODwqnDg8Ktw4PCs8ODwro=?=
手动方式
如果您无法使用mb_encode_mimeheader()
,则可以使用某些third-party PHP library,或创建自己的编码功能。
$subject = "áéíóú";
$encoded_subject = "=?ISO-8859-1?Q?" . quoted_printable_encode($subject) . "?=";
print $encoded_subject;
// Output: =?ISO-8859-1?Q?=C3=A1=C3=A9=C3=AD=C3=B3=C3=BA?=
血腥细节
答案 1 :(得分:1)
对我有用的是:$Subject = "=?UTF-8?B?". base64_encode($Subject). "?=";
这反过来了:
function Subject($subject) {
$prefix = "=?UTF-8?B?";
return (stristr($subject,$prefix) === false ?
$subject :
base64_decode(substr(substr($subject,10),0,-2) ));
}
答案 2 :(得分:0)
你有这个:$subject = $subject;
,但你从未真正设置$subject
。因此,您将未初始化的值传递给mail()
,该值会被视为null
并导致问题。
答案 3 :(得分:-1)
$ asuntoUFT8 =“例如FelizCumpleañosde的示例!”;
$ asunto =“ =?UTF-8?B?”。base64_encode($ asuntoUFT8)。“ =?=”;