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.