我使用 Postfix 作为邮件服务器。我有 Ubuntu 操作系统。
然后我使用 PHP 发送电子邮件。
问题是我的 VPS 提供商使用的邮件软件都没有对我的电子邮件进行正确的编码。
据他们说,问题出在我身上。
只有姓名字段编码不正确。例如,我的电子邮件中的“Björn”变成了“Björn”。
但是,当我回应时$name
,它输出“比约恩“ 哪个是对的。
此外,gmail 和 hotmail 确实显示正确。
奇怪的是,“文本”(消息本身)被正确编码。
我使用以下命令发送邮件:
$headers="MIME-Version: 1.0"."\n";
$headers.="Content-type: text/plain; charset=UTF-8"."\n";
$headers.="From: $name <$email>"."\n";
$name= iconv(mb_detect_encoding($name), "UTF-8//IGNORE//TRANSLIT", $name);
//// I HAVE TRIED WITH AND WITHOUT THE LINE ABOVE, NO DIFFERENCE
mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $text, $headers, '[email protected]');
我也尝试过使用和不使用 iconv 行,但是都没有成功。
我能想到的最后一件事是后缀,那里可以设置字符编码吗?有人知道吗?
答案1
消息文本可以是您定义的任何字符集(因为您在邮件头(content-type = utf8)中定义了邮件的字符集),但邮件头(主题、发件人姓名、电子邮件)是在读取电子邮件的客户端中定义的,因此您无法影响它。Gmail 使用 utf8 作为默认设置,而查看电子邮件的其他客户端可以使用他们喜欢的任何字符,并且基本上只有 ASCII 字符在任何地方都受到完全支持。
编辑:如果字符是 MIME 编码的(“=?charset?encoding?encoded text?=”),则可以在邮件头中包含 US-ASCII 以外的字符。
答案2
我看到的一个问题是你已经转换$name
为UTF-8后将其嵌入到 中$headers
。因此,发送到 postfix 的内容是之前的内容。您应该iconv()
将其添加到其中并添加 MIME 编码前将其添加到$headers
。