gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:52:39 26 4
gpt4 key购买 nike

我有一个相当简单的功能来发送电子邮件。我开始实现电子邮件的翻译版本,随之而来的是 é 和 ó 等特殊字符。每当我在电子邮件的主题中包含这些内容时,电子邮件都会在我的 amavis 中导致 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));
}

最佳答案

编码邮件 header

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

编码类型

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

// 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 - 电子邮件主题中的标题错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21168786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com