【问题标题】:Bad Header in email subject?电子邮件主题中的错误标题?
【发布时间】:2014-01-16 17:31:39
【问题描述】:

我有一个相当简单的功能来发送电子邮件。 我开始实现电子邮件的翻译版本,随之而来的是特殊字符,例如 é 和 ó。每当我在电子邮件的主题中包含这些内容时,该电子邮件都会在我的 amavis 中引发 BAD_HEADER 错误,从而造成麻烦。

显然它不是 8bit 编码的,这首先是有道理的。但是,我在网上找不到任何指南或解释如何正确编码主题。

只是为了好玩,我尝试了 é 而不是 é,当然问题已经解决了。但与此同时,电子邮件的主题是 é,而不是 é。

这是我目前拥有的脚本:

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));
}

【问题讨论】:

  • 您需要使用带引号的可打印或 base64 对主题进行编码。这是一个例子:stackoverflow.com/questions/13645869/…
  • @grebneke 谢谢,我正在尝试这个解决方案。
  • @grebneke 我尝试使用您的链接中给出的这个quoted_printable_encode()。但是当我使用它时,我的脚本完全停止了。 ://

标签: php email


【解决方案1】:

编码邮件标头

如果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开始

【讨论】:

  • 谢谢,这成功了。我首先尝试了引用的可打印文件,但后来发现我的提供程序仅在 php 5.2.17 上运行,而在 5.3 中添加了每个文档的引用可打印文件。我现在使用 Base64,它就像一个魅力
【解决方案2】:

对我有用的是:$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) ));
}

【讨论】:

  • 谢谢,你节省了我一天的时间
【解决方案3】:

你有这个:$subject = $subject;,但你从未真正设置过$subject。因此,您将一个未初始化的值传递给mail(),它被视为null 并导致问题。

【讨论】:

    【解决方案4】:

    $asuntoUFT8 = "Example te desea un Feliz Cumpleaños ?!!";

    $asunto = "=?UTF-8?B?".base64_encode($asuntoUFT8)."=?=";

    【讨论】:

    • 请花点时间阅读help center 中的editing help。 Stack Overflow 上的格式与其他网站不同。
    • 此线程中已经存在一个非常相似的答案,请解释您的不同之处。
    猜你喜欢
    • 2012-01-11
    • 1970-01-01
    • 2020-09-18
    • 2015-03-21
    • 1970-01-01
    • 2019-10-19
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多