电子邮件主题中的错误标题?

时间:2014-01-16 17:31:40

标签: php email

我有一个相当简单的功能来发送电子邮件。 我开始实现电子邮件的翻译版本,并带有特殊字符,如é和ó。每当我在电子邮件的主题中有这些内容时,电子邮件就会因为我的爱好者造成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));
}

4 个答案:

答案 0 :(得分:4)

编码邮件标题

Subject: header如果包含ASCII字符集之外的任何字符,则需要进行编码。

编码类型

您可以使用两种编码:Quoted PrintableBase64。内容áéíóú的典型编码主题标题如下所示:

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

血腥细节

正确地进行MIME编码并非易事。要了解有关它的所有信息,您应该首先研究RFC 2047RFC 2045

答案 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)。“ =?=”;