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


82

当我发送电子邮件时,该电子邮件不显示除英语以外的其他字符。它的确显示如下:

余生ä»ä»

可能知道实际上是什么原因造成的?即使我尝试在脚本中添加Content-type和charset,它仍然显示相同的内容。

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


2
你用什么?本地mail()Zend_MailPHPMailer?需要一些工厂方法的代码!
韦斯利·范·欧普多普

2
您还必须照顾目标电子邮件客户端。即使您设法在电子邮件客户端中正确查看电子邮件,也并不意味着您的客户会看到正确的电子邮件。最后,我总是用utf-8 charset标头构建html-emails。这样,大多数电子邮件客户端都会正确显示内容。
Marco Marco

@FlyBy:是的,正是我想做的,使用utf-8字符集显示内容,但是我仍然看不到正确的电子邮件。
deepWebMie 2011年

内容类型和字符集正是完成这项工作所需的,但是您需要向我们提供更多信息。您能告诉我们代码吗?和/或结果消息的来源?您确定您的数据已正确utf8编码吗?
2011年

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" => "Test Send Chinese mail-好信"); $mail->send($to, $headers, $body); 这是正确的吗?它没有显示我的期望。它应该在正文,标题甚至主题中显示中文单词。
deepWebMie 2011年

Answers:


116

您可以在邮件正文中添加标题“ 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” =>“ Test Send Chinese mail-好信”); $ mail-> send($ to,$ headers,$ body)这样正确吗?它没有显示我的期望。它应该在正文,标题甚至主题中显示中文单词。
deepWebMie 2011年

1
哪些电子邮件工具仍使用7位传输编码?
Grodriguez 2015年

3
php的第四个参数mail()是字符串,而不是数组!
弗拉基米尔·潘捷列夫

2
一定要写在charset=UTF-8没有引号的地方UTF-8
Mel_T

4
text/html当您以HTML格式发送电子邮件时使用。对于纯文本电子邮件,您需要text/plain
斯图尔特

34

我使用的是特定的字符集(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);
}

2
而且,如果您尝试发送无法在ISO-8859-2中表示的内容,该怎么办?
deceze

4
$headers.= "From: =?utf-8?b?".base64_encode($from_name)."?= <".$from_a.">\r\n";这条线解决了我的问题,谢谢!
朱莉娅

1
考虑引号的可打印编码以提高纯文本邮件的可读性,它很简单:'=?utf-8?Q?' . quoted_printable_encode($string) . '?='
引用Eddie

@朱莉娅谢谢,我也是。
fdrv

cc和bcc呢?
Toskan

1

如果不是HTMLUTF-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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.