Як надіслати електронний лист UTF-8?


83

Коли я надсилаю електронне повідомлення, у ньому не відображаються інші символи, крім англійської. Це відображається, як показано нижче:

ä½ ™ ç ”ää” ä »

Може знати насправді, що це спричиняє? Навіть я намагався додати тип вмісту та коди в скрипт, він все одно показує те саме.

я використав Mail::Factory("mail");


2
Що ти використовуєш? рідний mail()чи Zend_Mailчи PHPMailer? Потрібен код заводського методу!
Wesley van Opdorp

2
Ви повинні додатково подбати про цільових поштових клієнтів. Навіть якщо вам вдалося правильно переглянути електронну пошту у своєму поштовому клієнті, це не означає, що ваш клієнт побачить пошту правильно. Зрештою, я завжди будую html-електронні листи з заголовком коду коду utf-8. Таким чином, більшість поштових клієнтів відображають вміст правильно.
Марко

@FlyBy: так, саме те, що я хочу зробити, відображати вміст із кодировкою utf-8, але я все ще не бачу електронного листа правильно.
deepWebMie

Content-Type та charset - це саме те, що вам потрібно для того, щоб зробити цю роботу, але вам потрібно надати нам більше інформації. Ви можете показати нам код. та / або джерело отриманого повідомлення? Ви впевнені, що ваші дані правильно закодовані utf8?
триплеє

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

Відповіді:


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);

ось мій код $ mail = Mail :: factory ("пошта"); $ до = "me@abc.com"; $ body = "好 信"; $ headers = array ("Content-type =>" text / plain: charset = \ "UTF-8", "From" => "abc@abc.com", "To" => "me@abc.com" , "Тема" => "Тест Надіслати китайською поштою - 好 信"); $ mail-> send ($ to, $ headers, $ body) Чи правильно? Це не показує, чого я очікую. Він повинен відображати китайське слово в тілі, заголовку чи навіть темі.
deepWebMie

1
Які засоби електронної пошти досі використовують 7-бітове кодування передачі?
Гродрігес

3
4-й параметр для 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());
    }

Я зробив ще одну функцію розсилки, оскільки пристрій apple не може добре читати попередню версію.

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 ?!
обдурити

4
$headers.= "From: =?utf-8?b?".base64_encode($from_name)."?= <".$from_a.">\r\n";цей рядок вирішив мою проблему, дякую!
Джулія

2
Розгляньте кодоване кодування для друку для читабельності у розсильних листах, це так само просто:'=?utf-8?Q?' . quoted_printable_encode($string) . '?='
Цитування Едді

@Julia Дякую, і мені теж.
fdrv

а як щодо куб.
Тоскан

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);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.