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     = "[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;  
}

$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.

Jon
źródło
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 .

AlexV
źródło
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";
użytkownik2354947
źródło
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";
vzr
źródło
5

Pracuję w ten sposób

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

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

yorkfx
źródło
Sam nie mam POST, tylko zwykły francuski napis zapisany w pliku zakodowanym w utf-8, a to działało jak urok, dzięki!
toni07
3
$mail = new PHPMailer();
$mail->CharSet = "UTF-8";
$mail->Encoding = "16bit";
Ali ebrahimi
źródło
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.

biojazzard
źródło
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) . '?=';;
Ohad Cohen
źródło
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.

Nikos Kapetanakos
źródło
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"
Trung Bui
źródło
@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 = '[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();
Mohammed Alhfian
źródło
-5

$ mail -> charSet = "UTF-8"; --- ta linia powinna mieć wartość $ mail = new PHPMailer (); linia.

pff ..


źródło