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

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.

Ion
quelle
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 .

AlexV
quelle
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";
user2354947
quelle
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";
vzr
quelle
5

Ich arbeite mich so

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

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

yorkfx
quelle
Ich habe selbst kein POST-Ding, nur eine normale französische Zeichenfolge, die in einer utf-8-codierten Datei geschrieben ist, und das hat wie ein Zauber funktioniert, danke!
Toni07
3
$mail = new PHPMailer();
$mail->CharSet = "UTF-8";
$mail->Encoding = "16bit";
Ali Ebrahimi
quelle
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.

Biojazzard
quelle
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) . '?=';;
Ohad Cohen
quelle
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.

Nikos Kapetanakos
quelle
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"
Trung Bui
quelle
@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 = '[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
quelle
-5

$ mail -> charSet = "UTF-8"; --- Diese Zeile sollte unter $ mail = new PHPMailer () stehen. Linie.

pff ..


quelle