Làm thế nào để gửi email UTF-8?


82

Khi tôi gửi email, email không hiển thị các ký tự khác ngoài tiếng Anh. Nó hiển thị như dưới đây:

ä½ ™ ç ”Ÿä» ä »

Có thể biết thực sự nguyên nhân này là gì? Ngay cả khi tôi đã cố gắng thêm Loại nội dung và bộ ký tự trong tập lệnh, nó vẫn hiển thị như cũ.

Tôi đã sử dụng Mail::Factory("mail");


2
Bạn dùng gì? bản địa mail()hoặc Zend_Mailhoặc PHPMailer? Cần một số mã của phương thức Nhà máy!
Wesley van Opdorp

2
Bạn cũng phải chăm sóc thêm các ứng dụng email đích. Ngay cả khi bạn quản lý để xem email một cách chính xác trong ứng dụng email của bạn không có nghĩa là khách hàng của bạn sẽ thấy đúng thư. Cuối cùng, tôi luôn xây dựng các email html với tiêu đề bộ mã utf-8. Bằng cách này, hầu hết các ứng dụng email đều hiển thị nội dung chính xác.
Marco

@FlyBy: vâng, đó chính xác là những gì tôi muốn làm, hiển thị nội dung bằng bộ ký tự utf-8, nhưng tôi vẫn không thể nhìn thấy email một cách chính xác.
deepWebMie

Loại nội dung và bộ ký tự chính xác là những gì bạn cần để làm cho việc này hoạt động, nhưng bạn cần cung cấp thêm thông tin cho chúng tôi. Bạn có thể cho chúng tôi xem mã. và / hoặc nguồn của thông báo kết quả? Bạn có chắc chắn dữ liệu của mình được mã hóa chính xác utf8 không?
ba

3
đây là mã ví dụ của tôi: $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); Điều này có đúng không? Nó không hiển thị những gì tôi mong đợi. Nó phải hiển thị từ tiếng Trung trong nội dung, tiêu đề hoặc thậm chí cả chủ đề.
deepWebMie

Câu trả lời:


116

Bạn có thể thêm tiêu đề "Content-Type: text / html; charset = UTF-8" vào nội dung thư của mình.

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

Nếu bạn sử dụng mail()hàm gốc thì mảng $ headers sẽ là tham số thứ 4 mail($to, $subject, $message, $headers)

Nếu bạn sử dụng PEAR Mail :: factory () mã sẽ là:

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

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

đây là mã của tôi $ mail = Mail :: factory ("mail"); $ to = "me@abc.com"; $ body = "好 信"; $ headers = array ("Content-type =>" text / trơn: charset = \ "UTF-8", "Từ" => "abc@abc.com", "Tới" => "me@abc.com" , "Chủ đề" => "Kiểm tra Gửi thư tiếng Trung- 好 信"); $ mail-> send ($ to, $ headers, $ body) Điều này có đúng không? Nó không hiển thị những gì tôi mong đợi. Nó phải hiển thị từ tiếng Trung trong nội dung, tiêu đề hoặc thậm chí cả chủ đề.
deepWebMie

1
Những công cụ email nào vẫn sử dụng mã hóa truyền 7 bit?
Grodriguez

3
Tham số thứ 4 của php mail()là một chuỗi, không phải một mảng !!
Vladimir Panteleev

2
Hãy chắc chắn để viết charset=UTF-8mà không có dấu ngoặc kép xung quanh UTF-8!
Mel_T

4
Chỉ sử dụng text/htmlnếu bạn đang gửi email ở định dạng HTML. Đối với email văn bản thuần túy, bạn muốn text/plain.
Stewart

34

Tôi đang sử dụng bộ ký tự khá được chỉ định (ISO-8859-2) vì không phải mọi hệ thống thư (ví dụ: http://10minutemail.com ) đều có thể đọc thư UTF-8. Nếu bạn cần cái này:

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

Tôi đã thực hiện một chức năng bưu phẩm khác, vì thiết bị apple không thể đọc tốt phiên bản trước.

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
Và điều gì sẽ xảy ra nếu bạn đang cố gửi nội dung không thể được thể hiện trong ISO-8859-2 ?!
dối trá

4
$headers.= "From: =?utf-8?b?".base64_encode($from_name)."?= <".$from_a.">\r\n";dòng này đã giải quyết được vấn đề của tôi, cảm ơn!
Julia

1
Xem xét trích dẫn mã hóa có thể in được để có thể đọc trong bưu phẩm văn bản đơn giản, nó chỉ đơn giản:'=?utf-8?Q?' . quoted_printable_encode($string) . '?='
Trích dẫn Eddie

@Julia Cảm ơn, tôi cũng vậy.
fdrv

còn cc và bcc thì sao?
Toskan

1

Nếu không HTML, sau đó UTF-8không được khuyến khích. koi8-rwindows-1251chỉ không có vấn đề. Vì vậy, hãy sử dụng thư 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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.