Probleme mit der PHPMailer-Zeichenkodierung


188

Ich versuche, PHPMailer zu verwenden, um die Registrierung und Aktivierung zu senden. usw. Mail an Benutzer:

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

Das $messageenthält lateinische Zeichen. Leider verwenden alle Webmail (gmail, webmail.mydomain.org, emailaddress.domain.xx) eine andere Codierung.

Wie kann ich die Verwendung der UTF-8-Codierung erzwingen, um meine E-Mails in allen Postfächern genau gleich anzuzeigen?

Ich habe versucht, die Breite des Mail-Headers zu konvertieren mb_convert_encoding(), aber ohne Glück.


Die oben genannte Großschreibung von CharSet wurde vom Bovender geändert.
Gogowitsch

Antworten:


472

Wenn Sie zu 100% sicher sind, dass $ message ISO-8859-1 enthält, können Sie utf8_encode verwenden, wie David sagt. Verwenden Sie andernfalls mb_detect_encoding und mb_convert_encoding für $ message.

Beachten Sie auch das

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

Sollte ersetzt werden durch:

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

Und platziert nach der Instanziierung der Klasse (nach dem new). Die Eigenschaften unterscheiden zwischen Groß- und Kleinschreibung! Siehe das PHPMailer-Dokument für die Liste und die genaue Schreibweise.

Die Standardcodierung von PHPMailer ist 8bitauch problematisch für UTF-8-Daten. Um dies zu beheben, können Sie Folgendes tun:

$mail->Encoding = 'base64';

Beachten Sie, dass 'quoted-printable'dies in diesen Fällen wahrscheinlich auch funktionieren würde (und vielleicht sogar 'binary'). Weitere Informationen finden Sie unter RFC1341 - Content-Transfer-Encoding-Headerfeld .


35
Nun, ich weiß nicht, ob es jemanden interessiert, da dies verrückt alt ist, aber ich musste $ mail-> Encoding = "base64" hinzufügen, damit dies für mich funktioniert
Andrew Revak

5
@ AndrewRevak Du hast den Tag gerettet! :)
Carla

3
@ AndrewRevak Tolles Zeug! Das ist die Sache, die es gelöst hat.
BernardA

Die Verwendung von mb_detect_encoding und mb_convert_encoding wäre nett gewesen.
BluE

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

Linie $mail -> CharSet = "UTF-8";muss nach $mail = new PHPMailer();und ohne Leerzeichen sein!

Versuche dies

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

5
Ich habe diesen Beitrag zum besseren Lesen aktualisiert, aber die Frage der Operation wurde bereits vor 2 Jahren beantwortet! Und diese akzeptierte Antwort schloss diese bereits ein.
Dwza

5

Tut mir leid, dass ich zu spät auf der Party bin. Abhängig von Ihrer Serverkonfiguration müssen Sie das Zeichen möglicherweise ausschließlich mit Kleinbuchstaben utf-8 angeben. Andernfalls wird es ignoriert. Versuchen Sie dies, wenn Sie hier nach Lösungen suchen und keine der oben genannten Antworten hilft:

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

sollte ersetzt werden durch:

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


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

3

Ich wurde & oacute; in $ mail-> Betreff / w PHPMailer.

Für mich lautet die Komplettlösung also:

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

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

Ich hoffe es hilft.


1

Wenn keines der oben genannten Verfahren funktioniert und E-Mails immer noch wie folgt aussehen ª הודפסה ×•× ×©×œ:

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

0

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

--- Diese Zeile sollte unter sein

$mail = new PHPMailer(); line.

pff ..


Ja, das ist richtig. Sie müssen es nach der Objektinstanziierung platzieren.


Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klarstellung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag. Sie können jederzeit Ihre eigenen Beiträge kommentieren. Sobald Sie einen ausreichenden Ruf haben, können Sie jeden Beitrag kommentieren .
piet.t

Es handelt sich nicht um eine Kritik oder Klarstellung für dieses Problem. Die richtige Antwort lautet: $ mail = new PHPMailer (); $ mail-> CharSet = 'UTF-8';
Nikos Kapetanakos

Zo me es sieht aus wie ein Kommentar zu Holians Antwort, da es nichts hinzufügt.
piet.t

Wenn Sie die charSet-Eigenschaft verwenden, funktioniert dies nicht. Das richtige ist CharSet. Der Fall macht den Unterschied.
Nikos Kapetanakos

Warum zitieren Sie dann die falsche Antwort, anstatt die richtige zu geben? Aber das gibt es auch schon, also was musst du hinzufügen?
piet.t

0

Der einfachste Weg und hilft Ihnen dabei, CharSet auf UTF-8 zu setzen

$mail->CharSet = "UTF-8"

@NickZuber Die genaue Zeile ist aufgrund von Änderungen vorhanden. Es war nicht so genau in der ursprünglichen Frage ...
Herr Tsjolder

0

Um Probleme bei der Zeichenkodierung beim Senden von E-Mails mit der Klasse PHPMailer zu vermeiden, können wir sie so konfigurieren, dass sie mit der UTF-8-Zeichenkodierung unter Verwendung des Parameters "CharSet" gesendet werden, wie im folgenden PHP-Code dargestellt:

$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"; --- Diese Zeile sollte unter $ mail = new PHPMailer () stehen. Linie.

pff ..

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.