Các vấn đề mã hóa ký tự PHPMailer


188

Tôi cố gắng sử dụng PHPMailer để gửi đăng ký, kích hoạt. vv thư cho người dùng:

require("class.phpmailer.php");
$mail -> charSet = "UTF-8";
$mail = new PHPMailer();
$mail->IsSMTP();  
$mail->Host     = "smtp.mydomain.org";  
$mail->From     = "name@mydomain.org";
$mail->SMTPAuth = true; 
$mail->Username ="username"; 
$mail->Password="passw"; 
//$mail->FromName = $header;
$mail->FromName = mb_convert_encoding($header, "UTF-8", "auto");
$mail->AddAddress($emladd);
$mail->AddAddress("mytest@gmail.com");
$mail->AddBCC('mytest2@mydomain.org', 'firstadd');
$mail->Subject  = $sub;
$mail->Body = $message;
$mail->WordWrap = 50;  
if(!$mail->Send()) {  
   echo 'Message was not sent.';  
   echo 'Mailer error: ' . $mail->ErrorInfo;  
}

Các $messageký tự Latin. Thật không may, tất cả các webmail (gmail, webmail.mydomain.org, emailaddress.domain.xx) đang sử dụng một mã hóa khác nhau.

Làm cách nào tôi có thể buộc sử dụng mã UTF-8 để hiển thị thư của mình giống hệt nhau trên tất cả các hộp thư?

Tôi đã cố gắng chuyển đổi chiều rộng tiêu đề thư mb_convert_encoding(), nhưng không có may mắn.


Viết hoa của Charset ở trên đã được thay đổi bởi bovender.
Gogowitsch 22/03/2016

Câu trả lời:


472

Nếu bạn chắc chắn 100% $ message chứa ISO-8859-1, bạn có thể sử dụng utf8_encode như David nói. Mặt khác, sử dụng mb_detect_encodingmb_convert_encoding trên $ message.

Cũng lưu ý rằng

$mail -> charSet = "UTF-8"; 

Nên thay thế bằng:

$mail->CharSet = 'UTF-8';

được đặt sau khi khởi tạo lớp (sau new). Các thuộc tính là trường hợp nhạy cảm! Xem tài liệu PHPMailer để tìm danh sách & chính tả.

Ngoài ra, mã hóa mặc định của PHPMailer 8bitcó thể gây rắc rối với dữ liệu UTF-8. Để khắc phục điều này bạn có thể làm:

$mail->Encoding = 'base64';

Hãy lưu ý rằng 'quoted-printable'có lẽ cũng sẽ hoạt động trong những trường hợp này (và thậm chí có thể 'binary'). Để biết thêm chi tiết, bạn có thể đọc RFC1341 - Trường tiêu đề chuyển mã hóa nội dung .


35
Chà tôi không biết có ai quan tâm vì điều này thật điên rồ không, nhưng tôi đã phải thêm $ mail-> Encoding = "base64" để làm việc này cho tôi
Andrew Revak

5
@AndrewRevak Bạn đã lưu ngày! :)
carla

3
@AndrewRevak Thứ tuyệt vời! Đó là điều đã giải quyết nó.
BernardA

Việc sử dụng mb_detect_encoding và mb_convert_encoding sẽ rất tuyệt.
BluE

26
$mail -> CharSet = "UTF-8";
$mail = new PHPMailer();

dòng $mail -> CharSet = "UTF-8";phải sau $mail = new PHPMailer();và không có khoảng trắng!

thử cái này

$mail = new PHPMailer();
$mail->CharSet = "UTF-8";

5
Tôi đã cập nhật bài đăng này để đọc tốt hơn, nhưng câu hỏi của op đã được trả lời 2 năm trước! Và câu trả lời được chấp nhận bao gồm cái này rồi.
Dwza 25/2/2015

5

Xin lỗi vì đến muộn trong bữa tiệc. Tùy thuộc vào cấu hình máy chủ của bạn, Bạn có thể được yêu cầu chỉ định đúng ký tự với các chữ cái thường utf-8, nếu không nó sẽ bị bỏ qua. Hãy thử điều này nếu bạn kết thúc ở đây để tìm kiếm giải pháp và không có câu trả lời nào ở trên giúp được:

$mail->CharSet = "UTF-8";

nên được thay thế bằng:

$mail->CharSet = "utf-8";

5

Tôi làm việc theo cách này

  $mail->FromName = utf8_decode($_POST['name']);

http://php.net/manual/en/feft.utf8-decode.php


Bản thân tôi không có bài POST, chỉ là một chuỗi tiếng Pháp thông thường được viết trong một tệp được mã hóa utf-8, và điều này đã làm việc như một cơ duyên, cảm ơn!
toni07

3
$mail = new PHPMailer();
$mail->CharSet = "UTF-8";
$mail->Encoding = "16bit";

3

Tôi đã nhận được & oacute; trong $ mail-> Chủ đề / w PHPMailer.

Vì vậy, đối với tôi giải pháp hoàn chỉnh là:

// Your Subject with tildes. Example.
$someSubjectWithTildes = 'Subscripción España';

$mailer->CharSet = 'UTF-8';
$mailer->Encoding = 'quoted-printable';
$mailer->Subject = html_entity_decode($someSubjectWithTildes);

Hy vọng nó giúp.


1

Khi không hoạt động ở trên, và thư vẫn trông như ª הודפסה ×•× ×©×œ:

$mail->addCustomHeader('Content-Type', 'text/plain;charset=utf-8');
$mail->Subject = '=?UTF-8?B?' . base64_encode($subject) . '?=';;

0

@ $mail -> charSet = "UTF-8";

--- dòng này nên ở dưới

$mail = new PHPMailer(); line.

pff ..


Vâng, đúng rồi. Bạn phải đặt nó sau khi khởi tạo đối tượng.


Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ - bạn luôn có thể nhận xét về bài đăng của riêng bạn và khi bạn có đủ danh tiếng, bạn sẽ có thể nhận xét về bất kỳ bài đăng nào .
piet.t

Đây không phải là một yêu cầu phê bình hoặc làm rõ cho vấn đề này. Câu trả lời đúng là: $ mail = new PHPMailer (); $ mail-> CharSet = 'UTF-8';
Nikos Kapetanakos

Cho tôi biết nó giống như một nhận xét về câu trả lời của Holian vì nó không thêm bất cứ điều gì vào nó.
piet.t

nếu bạn sử dụng thuộc tính charSet sẽ không hoạt động. Một trong những chính xác là CharSet. Các trường hợp làm cho sự khác biệt.
Nikos Kapetanakos

Vậy thì tại sao bạn lại trích dẫn câu trả lời sai thay vì đưa ra câu trả lời đúng? Nhưng cái đó cũng đã có rồi, vậy bạn phải thêm cái gì?
piet.t

0

Cách đơn giản nhất và sẽ giúp bạn với đó là đặt CharSet thành UTF-8

$mail->CharSet = "UTF-8"

@NickZuber Dòng chính xác là có do chỉnh sửa. Điều đó không chính xác trong câu hỏi ban đầu ...
Ông Tsjolder

0

Để tránh các vấn đề về mã hóa ký tự khi gửi email bằng lớp PHPMailer, chúng ta có thể định cấu hình nó để gửi nó bằng mã hóa ký tự UTF-8 bằng tham số "Charset", như chúng ta có thể thấy trong mã Php sau:

$mail = new PHPMailer();
$mail->From = 'midireccion@email.com';
$mail->FromName = 'Mi nombre';
$mail->AddAddress('emaildestino@email.com');
$mail->Subject = 'Prueba';
$mail->Body = '';
$mail->IsHTML(true);


// Active condition utf-8
$mail->CharSet = 'UTF-8';


// Send mail
$mail->Send();

-5

$ mail -> charSet = "UTF-8"; --- dòng này phải dưới $ mail = new PHPMailer (); hàng.

pff ..

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.