如何发送 UTF-8 编码的电子邮件?

96

当我发送电子邮件时,邮件中显示的字符除英语外都没有显示出来。 它显示如下:

余生ä»ä»

可能知道这是什么原因吗? 即使我尝试在脚本中添加Content-type和charset,它仍然显示相同。

我使用了 Mail::Factory("mail");


2
你使用什么?原生的 mail() 还是 Zend_Mail 或者 PHPMailer?需要一些工厂方法的代码! - Wesley van Opdorp
2
你还需要注意目标电子邮件客户端。即使你成功在自己的电子邮件客户端中正确查看了邮件,也不意味着你的客户能够正确地看到邮件内容。最终,我总是使用utf-8字符集头构建HTML电子邮件。这样大多数电子邮件客户端都能正确显示内容。 - Marco
Content-Type和charset是使其正常工作所需的必要条件,但您需要提供更多信息。您能否向我们展示代码和/或结果消息的源代码?您确定您的数据已正确进行UTF8编码吗? - tripleee
3
这是我的示例代码:$mail = Mail::factory("mail"); $to = "me@abc.com"; $body = "好信"; $headers = array( "Content-type" => "text/plain; charset=\"UTF-8\"", "From" => "abc@abc.com", "To" => "me@abc.com", "Subject" => "测试发送中文邮件-好信" ); $mail->send($to, $headers, $body);这个代码正确吗?它没有显示我期望的内容。它应该在邮件正文、标题或者头部显示出中文字符。 - deepWebMie
@hakre:我使用了PEAR。那么这个可以对电子邮件中的内容进行编码吗?我尝试像上面的代码一样将内容设置为utf-8,但失败了。 - deepWebMie
显示剩余5条评论
3个回答

127

你可以在消息体中添加头部 "Content-Type: text/html; charset=UTF-8"。

$headers = "Content-Type: text/html; charset=UTF-8";

如果您使用本机的mail()函数,$headers数组将成为第四个参数:mail($to, $subject, $message, $headers)

如果您使用PEAR Mail::factory(),则代码如下:

$smtp = Mail::factory('smtp', $params);

$mail = $smtp->send($to, $headers, $body);

这是我的代码: $mail = Mail::factory("mail"); $to = "me@abc.com"; $body = "好信"; $headers = array("Content-type =>"text/plain: charset="UTF-8","From" => "abc@abc.com","To" => "me@abc.com","Subject" => "测试发送中文邮件-好信"); $mail->send($to, $headers, $body)这个代码正确吗?它没有显示我期望的内容。它应该在正文、标题甚至主题中显示出中文。 - deepWebMie
1
哪些电子邮件工具仍在使用7位传输编码? - Grodriguez
3
PHP中mail()函数的第四个参数是字符串,而不是数组。 - Vladimir Panteleev
2
请务必在UTF-8周围不加引号写上charset=UTF-8 - Mel_T
5
如果你发送的是 HTML 格式的电子邮件,请使用 text/html。对于纯文本电子邮件,你需要使用 text/plain - Stewart
显示剩余2条评论

37

我使用了相对特定的字符集(ISO-8859-2),因为并非每个邮件系统(例如:http://10minutemail.com)都能读取UTF-8格式的邮件。如果您需要,请告诉我:

function utf8_to_latin2($str)
{
    return iconv ( 'utf-8', 'ISO-8859-2' , $str );
}
function my_mail($to,$s,$text,$form, $reply)
    {
        mail($to,utf8_to_latin2($s),utf8_to_latin2($text),
        "From: $form\r\n".
        "Reply-To: $reply\r\n".
        "X-Mailer: PHP/" . phpversion());
    }

我又制作了一个邮件发送函数,因为苹果设备无法很好地读取之前的版本。

function utf8mail($to,$s,$body,$from_name="x",$from_a = "info@x.com", $reply="info@x.com")
{
    $s= "=?utf-8?b?".base64_encode($s)."?=";
    $headers = "MIME-Version: 1.0\r\n";
    $headers.= "From: =?utf-8?b?".base64_encode($from_name)."?= <".$from_a.">\r\n";
    $headers.= "Content-Type: text/plain;charset=utf-8\r\n";
    $headers.= "Reply-To: $reply\r\n";  
    $headers.= "X-Mailer: PHP/" . phpversion();
    mail($to, $s, $body, $headers);
}

4
如果您正在尝试发送无法表示为ISO-8859-2的内容,该怎么办?! - deceze
5
这行代码解决了我的问题,谢谢! $headers .= "From: =?utf-8?b?".base64_encode($from_name)."?= <".$from_a.">\r\n"; - Julia
3
考虑使用可引用编码来提高纯文本邮件的可读性,方法非常简单:'=?utf-8?Q?' . quoted_printable_encode($string) . '?=' - Quoting Eddie
@Julia 谢谢,我也是。 - fdrv
抄送和密送呢? - Toskan
对于阅读此答案并想知道 =?utf-8?b?= 是什么意思的人,请参见 https://ncona.com/2011/06/using-utf-8-characters-on-an-e-mail-subject/ 了解详情。 - Patanjali

2
如果不使用HTML,则不建议使用UTF-8。koi8-r和windows-1251是可以正常使用的。因此,请使用HTML邮件。
$headers['Content-Type']='text/html; charset=UTF-8';
$body='<html><head><meta charset="UTF-8"><title>ESP Notufy - ESP Сообщения</title></head><body>'.$text.'</body></html>';


$mail_object=& Mail::factory('smtp',
    array ('host' => $host,
        'auth' => true,
        'username' => $username,
        'password' => $password));
$mail_object->send($recipents, $headers, $body);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接