PHP邮件无法正确呈现西班牙语重音

时间:2014-01-29 09:29:49

标签: php non-ascii-characters

目前,当发送包含西班牙口音的PHP电子邮件时,电子邮件的呈现方式如下:

Ω₯ζλZΫiz«’Ό*'΅ινO*^rνz{

我正在设置以下标题:

$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n";
$headers .= "X-Priority: 3\r\n";
$headers .= "X-Mailer: PHP". phpversion() ."\r\n";

示例正文消息是:

Estudio bíblico en Web Church Connect

我还设置了html的字符集:

$message = '
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
            <title>WebChurchConnect</title>
        </head>
        <body>
';

任何想法都表示赞赏。

感谢。

2 个答案:

答案 0 :(得分:2)

电子邮件只接受ASCII字符,因为许多MTA未配备正确中继其他消息。你应该想到像洋葱这样的MIME-E-Mails :(它们闻起来,它们让你哭),而且它们有。 HTML邮件(内层)仅在处理完邮件的纯文本(外层)后才会被解码。

您需要在“外部”图层中显式编码任何非ASCII字符。您可以使用Content-Transfer-Encoding标头执行此操作,该标头可以设置为base64quoted-printable(某些现代MTA也支持8bitbinary但这些必须是明确地设定,支持仍然不像人们希望的那样普遍在2014年)。当然,此标头后面的MIME部分也需要使用指定的方法进行实际编码。幸运的是,Base64-Encoding只能拨打base64_encode

或者,由于您的消息是HTML格式(并且您似乎并不关心提供明文替代方案 - 您应该这样做),您也可以使用HTML的转义机制(例如&iacute;而不是{{1}但是,Base64通常更安全,因为它可以免受MTA的攻击,这些MTA会在78个字符后分解长行。

答案 1 :(得分:1)

尝试使用PHPMailerSwiftMailer。像这样的问题已经解决了,所有的东西都经过了测试,并且更容易让你使用。