PHP 发送的电子邮件主题 - Hotmail/Outlook 将 £ 显示为 £


PHP sent email subject - Hotmail/Outlook show £ as £

当我使用 PHP 邮件发送包含 £ 的电子邮件时,它在 outlook/hotmail 中显示为 - £。在Gmail/thunderbird中,这很好。

知道我该如何解决这个问题吗?

问题是,客户端不知道使用什么编码来编码主题。无论您的应用程序Content-Type标头中设置的任何内容都仅适用于电子邮件正文,而不适用于标头。

通常,这会影响以下标头:

  • 主题

为了使用不同的编码,您的国际化标头行应使用 MIME 编码(从 RFC 2047 开始),使用以下两种方法之一:base64 (B) 或修改后的引号可打印 (Q)。编码的主题通常如下所示:

Subject: =?ISO-8859-1?Q?Pr=FCfung_f=FCr?= Entwerfen von einer MIME kopfzeile

这可能看起来很困难,但是PHP中有一个非常方便的辅助函数,它可以完成所有魔术:

  • iconv_mime_encode() - 组成 MIME 标头字段

或者,您可以在以下位置进行讨论:

  • quoted_printable_encode() - 将 8 位字符串转换为带引号的可打印字符串

在直接使用quoted_printable_encode()之前,您需要考虑到长行需要以一定的长度拆分,空格需要替换为下划线"_"。

就在今天,我通过使用phpmailer而不是php的内置mail修复了一个类似的主题编码问题:

$mail = new PHPMailer(true);
$mail->IsSMTP();
$mail->CharSet = "utf8";
$mail->Subject = $mail->EncodeHeader("You won £10000000!");
....
$retval = $mail->Send();

通常我使用mb_convert_encoding()函数

mb_convert_encoding($string, "UTF-8"); //AUTO DETECT AND CONVERT
mb_convert_encoding($string, "UTF-8", "latin1"); //MANUAL SET - CHANGE latin1 TO CURRENT ENCODING

尝试在电子邮件中使用 UTF-8 编码。

这对我的

<?php $subject = "=?UTF-8?B?" . base64_encode($subject) . "?="; ?>