Problemy z kodowaniem znaków PHPMailer


190

Staram się używać PHPMailer do wysyłania rejestracji, aktywacji. etc mail do użytkowników:

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

$messageZawiera znaki alfabetu łacińskiego. Niestety cała poczta internetowa (gmail, webmail.mydomain.org, emailaddress.domain.xx) używa innego kodowania.

Jak mogę wymusić użycie kodowania UTF-8, aby wyświetlać dokładnie taką samą pocztę na wszystkich skrzynkach pocztowych?

Próbowałem przekonwertować szerokość nagłówka wiadomości mb_convert_encoding(), ale bez powodzenia.


Kapitalizacja CharSet powyżej została zmieniona przez bovender.
— Gogowitsch

Odpowiedzi:


476

Jeśli masz 100% pewności, że wiadomość $ zawiera ISO-8859-1, możesz użyć utf8_encode, jak mówi David. W przeciwnym razie użyj mb_detect_encoding i mb_convert_encoding na $ wiadomości.

Zwróć też uwagę na to

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

Należy zastąpić:

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

I umieszczone po wystąpieniu klasy (po new). We właściwościach rozróżniana jest wielkość liter! Zobacz dokument PHPMailer na liście i dokładną pisownię.

Również domyślne kodowanie PHPMailer 8bitmoże powodować problemy z danymi UTF-8. Aby to naprawić, możesz:

$mail->Encoding = 'base64';

Zauważ, 'quoted-printable'że prawdopodobnie zadziałałoby również w tych przypadkach (a może nawet 'binary'). Aby uzyskać więcej informacji można przeczytać RFC1341 - Content-Transfer-Encoding pole nagłówka .


35
Cóż, nie wiem, czy ktokolwiek się przejmuje, bo to jest szalone, ale musiałem dodać $ mail-> Encoding = "base64", żeby to zadziałało dla mnie
— Andrew Revak

5
@AndrewRevak Uratowałeś dzień! :)
— carla,

3
@AndrewRevak Świetne rzeczy! Właśnie to rozwiązało.
— Bernard,

Zastosowanie mb_detect_encoding i mb_convert_encoding byłoby fajne.
— BluE

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

linia $mail -> CharSet = "UTF-8";musi być za $mail = new PHPMailer();i bez spacji!

Spróbuj tego

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

5
Zaktualizowałem ten post, aby lepiej go czytać, ale na pytanie operacyjne już 2 lata temu odpowiedziano! I ta zaakceptowana odpowiedź zawiera już tę.
— Dwza

5

Przepraszam za spóźnienie na imprezie. W zależności od konfiguracji serwera może być konieczne podanie znaku wyłącznie małymi literami utf-8, w przeciwnym razie zostanie on zignorowany. Spróbuj tego, jeśli skończysz tutaj, szukając rozwiązań i żadna z powyższych odpowiedzi nie pomoże:

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

należy zastąpić:

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



3

Byłem coraz & oacute; w $ mail-> Temat / w PHPMailer.

Dla mnie kompletne rozwiązanie to:

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

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

Mam nadzieję, że to pomoże.


1

Gdy żadna z powyższych czynności nie działa, a wiadomości nadal wyglądają następująco ª הודפסה ×•× ×©×œ:

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

0

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

--- ta linia powinna być pod

$mail = new PHPMailer(); line.

pff ..


Tak, to jest poprawne. Musisz go umieścić po utworzeniu wystąpienia obiektu.


To nie daje odpowiedzi na pytanie. Aby skrytykować lub poprosić autora o wyjaśnienie, pozostaw komentarz pod jego postem - zawsze możesz komentować własne posty, a gdy będziesz mieć wystarczającą reputację , będziesz mógł komentować każdy post .
— piet.t

Nie jest to krytyka ani prośba o wyjaśnienie tego problemu. Prawidłowa odpowiedź to: $ mail = new PHPMailer (); $ mail-> CharSet = 'UTF-8';
— Nikos Kapetanakos,

Teraz wygląda na komentarz do odpowiedzi Holiana, ponieważ nic do niej nie dodaje.
— piet.t

jeśli użyjesz właściwości charSet, nie będzie działać. Prawidłowy to CharSet. Sprawa robi inaczej.
— Nikos Kapetanakos,

Dlaczego więc podajesz złą odpowiedź zamiast podać poprawną? Ale to już tam jest, więc co musisz dodać?
— piet.t

0

Najprostszym sposobem i pomocą będzie ustawienie CharSet na UTF-8

$mail->CharSet = "UTF-8"

@NickZuber Dokładna linia jest tam z powodu edycji. Nie było tak dokładnie w pierwotnym pytaniu ...
— Pan Tsjolder,

0

Aby uniknąć problemów z kodowaniem znaków podczas wysyłania wiadomości e-mail za pomocą klasy PHPMailer, możemy skonfigurować go tak, aby wysyłał go z kodowaniem znaków UTF-8 za pomocą parametru „CharSet”, jak widać w następującym kodzie php:

$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"; --- ta linia powinna mieć wartość $ mail = new PHPMailer (); linia.

pff ..

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.