Как отправить электронное письмо в кодировке UTF-8?

83

Когда я отправляю электронное письмо, в нем не отображаются символы, кроме английского. Это показано ниже:

ä½ ™ ç ”ä» ä »

Может знать, в чем причина этого? Даже я попытался добавить Content-type и charset в скрипт, он все равно показывает то же самое.

я использовал Mail::Factory("mail");

deepWebMie
источник
2
Что ты используешь? родной mail()или Zend_Mailили PHPMailer? Нужен код фабричного метода!
Уэсли ван Опдорп 01
2
Вы должны дополнительно позаботиться о целевых почтовых клиентах. Даже если вам удалось правильно просмотреть электронную почту в вашем почтовом клиенте, это не означает, что ваш клиент увидит правильную почту. В конце концов, я всегда создаю html-письма с заголовком кодировки utf-8. Таким образом, большинство почтовых клиентов правильно отображают контент.
Марко
@FlyBy: да, это именно то, что я хочу сделать, отображать контент с кодировкой utf-8, но я все еще не могу правильно видеть письмо.
deepWebMie 01
Content-Type и charset - это именно то, что вам нужно для того, чтобы эта работа работала, но вам нужно предоставить нам больше информации. Вы можете показать нам код? и / или источник итогового сообщения? Вы уверены, что ваши данные правильно закодированы в utf8?
Tripleee 01
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 01

Ответы:

116

Вы можете добавить заголовок Content-Type: text / html; charset = UTF-8 в тело сообщения.

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

Если вы используете встроенную mail()функцию, массив $ headers будет 4-м параметром mail($to, $subject, $message, $headers)

Если вы используете PEAR Mail :: factory (), код будет:

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

$mail = $smtp->send($to, $headers, $body);
s.webbandit
источник
вот мой код $ 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 01
1
Какие инструменты электронной почты все еще используют 7-битную кодировку передачи?
Grodriguez
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";эта строка решила мою проблему, спасибо!
Юлия
2
Рассмотрим цитируемую печатную кодировку для удобства чтения в текстовых почтовых программах, это так же просто:'=?utf-8?Q?' . quoted_printable_encode($string) . '?='
Цитата Эдди
@Julia Спасибо, я тоже.
fdrv
а как насчет cc и bcc?
Toskan
1

Если нет 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);
}
vml vml
источник