2010-03-22 36 views
108

Tôi cố gắng sử dụng PHPMailer để gửi đăng ký, kích hoạt. vv thư cho người dùng:Các vấn đề về mã hóa ký tự PHPMailer

require("class.phpmailer.php"); 
$mail -> charSet = "UTF-8"; 
$mail = new PHPMailer(); 
$mail->IsSMTP(); 
$mail->Host  = "smtp.mydomain.org"; 
$mail->From  = "[email protected]"; 
$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("[email protected]"); 
$mail->AddBCC('[email protected]', 'firstadd'); 
$mail->Subject = $sub; 
$mail->Body = $message; 
$mail->WordWrap = 50; 
if(!$mail->Send()) { 
    echo 'Message was not sent.'; 
    echo 'Mailer error: ' . $mail->ErrorInfo; 
} 

$message chứa ký tự latin. Thật không may tất cả các webmail (gmail, webmail.mydomain.org, emailaddress.domain.xx) sử dụng mã hóa khác nhau.

Làm cách nào để sử dụng mã UTF-8 để hiển thị chính xác thư của tôi trên tất 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.

+0

bạn có thay đổi gì không? –

+0

Viết hoa của CharSet ở trên đã bị thay đổi bởi bovender. – gogowitsch

Trả lời

299

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. Nếu không, hãy sử dụng mb_detect_encodingmb_convert_encoding trên thư $.

Ngoài ra hãy lưu ý rằng

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

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

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

đặt sau instantiation của lớp (sau khi "mới"). Các thuộc tính phân biệt chữ hoa chữ thường! Xem số PHPMailer doc ghi lại danh sách & chính tả chính xác.

+16

Tôi không biết có ai quan tâm đến điều này là điên rồ nhưng tôi phải thêm $ mail-> Encoding = "base64" để làm việc này cho tôi –

+4

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

+2

@AndrewRevak Công cụ tuyệt vời! Đó là điều đã giải quyết nó. – BernardA

0

Nếu thư của bạn sử dụng Latin1, bạn có thể sử dụng utf8_encode Làm việc cho tôi, dù sao đi nữa.

-4

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

PFF ..

4

Tôi làm việc bản thân mình theo cách này

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

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

+0

Tôi không có điều 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 sự quyến rũ, cảm ơn! – toni07

17
$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ử này

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

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âu trả lời này rồi. – Dwza

0

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

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

$mail = new PHPMailer(); line.

PFF ..


Vâng, đúng vậy. Bạn phải đặt nó sau khi instantiation đối tượng.

+0

Điều này không cung cấp câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ tác giả, để 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à sau khi bạn có đủ [danh tiếng] (http://stackoverflow.com/help/whats-reputation), bạn sẽ có thể [nhận xét về bài đăng bất kỳ] (http://stackoverflow.com/help/privileges/comment). –

+0

Nó 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'; –

+0

Zo me nó trông giống như một bình luận về câu trả lời của Holian vì nó không thêm bất cứ điều gì vào nó. –

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

Cách đơn giản nhất và sẽ giúp bạn có được thiết lập charset UTF-8

$mail->CharSet = "UTF-8" 
+0

Ông đã có dòng chính xác trong mã mẫu của mình. –

+0

@NickZuber Dòng chính xác là do chỉnh sửa. Nó không phải là chính xác trong câu hỏi ban đầu ... –

1

Xin lỗi vì đến trễ vào 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 ký tự đúng với chữ 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 các giải pháp và không ai trong số những câu trả lời ở trên giúp:

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

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

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

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

$mail = new PHPMailer(); 
$mail->From = '[email protected]'; 
$mail->FromName = 'Mi nombre'; 
$mail->AddAddress('[email protected]'); 
$mail->Subject = 'Prueba'; 
$mail->Body = ''; 
$mail->IsHTML(true); 


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


// Send mail 
$mail->Send(); 
Các vấn đề liên quan