1111 Stimmen

PHP Mail Funktion: UTF-8 Header in E-Mails

Info von Stefan Trost | Letztes Update am 30.04.2021 | Erstellt am 21.01.2014

Mit der Funktion mail() lassen sich mit PHP einfach E-Mails versenden. Ist der E-Mail-Text mit UTF-8 kodiert, reicht folgende Angabe im Header der E-Mail aus, damit die Darstellung im Mail-Programm des Empfängers gelingt:

Content-type: text/html; charset=UTF-8

Allerdings bezieht sich der "Content-Type" nur auf den Text der E-Mail. Möchten wir auch innerhalb des Headers mit UTF-8 arbeiten, müssen wir anders vorgehen.

Wenn der Header 8-Bit-Zeichen außerhalb des ASCII-Bereichs enthält, kann es nämlich schnell zu Problemen kommen, da es genug Server und Programme gibt, die dann mit den Zeichen nicht mehr umgehen können. Ohne Probleme lassen sich daher beispielsweise Zahlen oder Buchstaben von A bis Z verwenden, aber sobald wir zum Beispiel in den Bereich der deutschen Umlaute kommen, treten fehlerhafte Darstellungen auf, da die deutschen Umlaute außerhalb des ASCII-Bereichs liegen.

Oft passiert es daher, dass eine Mail-Funktion zwar auf den ersten Blick wunderbar funktioniert, dies aber nur daran liegt, dass bisher lediglich ASCII-Zeichen im Betreff und Namen der Absender und Empfänger vorgekommen sind. Sobald der erste Müller eine E-Mail empfängt, bricht das System zusammen.

UTF-8 Kodierung im Header

Um dennoch UTF-8-Zeichen im Header verwenden zu können, müssen wir den entsprechenden String so kodieren, dass er nur noch 7-Bit-Zeichen enthält, die für alle beteiligten Programme verständlich sind.

Dazu eignet sich die PHP-Funktion base64_encode, die den übergebenen String mit base64 codiert. Dies ist ein Verfahren, das dazu entwickelt wurde, Binärdateien in Systemen übertragen zu können, die nicht mit 8-Bit Zeichen umgehen können.

$subject = 'Betreff mit Ä, Ö und Ü';
$subject = '=?UTF-8?B?'.base64_encode($subject).'?=';

In dem Beispiel möchten wir eine E-Mail mit einem Betreff voller Umlaute versenden. Dazu übergeben wir den Betreff-String der base64_encode-Funktion und bauen daraus den Betreff.

Wichtig ist hier, dass wir dem Ergebnis der Funktion die Zeichenkette "=?UTF-8?B?" voranstellen und mit "?=" abschließen. Damit weiß das Programm, das die E-Mail später darstellen soll, dass es sich hierbei um einen base64-encodierten UTF-8-String handelt und wo dieser anfängt und aufhört.

Vollständiges Beispiel für den Versand einer E-Mail

Zuletzt möchten wir uns noch ein Beispiel ansehen, in dem die vorgestellten Funktionen angewendet werden.

// Absender, Empfänger und Betreff kodieren
$abs     = '=?UTF-8?B?'.base64_encode('Anna Müller').'?=';
$empf    = '=?UTF-8?B?'.base64_encode('Ben Höffer').'?=';
$betreff = '=?UTF-8?B?'.base64_encode('Von Müller an Höffer').'?=';

// E-Mail Adressen anhängen
$abs    .= ' <abs@example.com>';
$empf   .= ' <empf@example.com>';

// Header schreiben
$header  = 'MIME-Version: 1.0' . "\r\n";
$header .= 'Content-type: text/html; charset=UTF-8' . "\r\n";
$header .= 'To: ' . $empf . "\r\n";
$header .= 'From: ' . $abs . "\r\n";
 
// HTML-Nachricht schreiben
$msg     = '<html><head><title>Von Müller an Höffer</title></head>';
$msg    .= '<body><p>Nachricht</p></body></html>';

// Mail versenden
mail($empf, $betreff, $msg, $header);

Wir versenden hier eine UTF8-HTML-E-Mail. Damit die Darstellung des Textes der E-Mail gelingt, haben wir im Header im Content-Type "charset=UTF-8" angegeben. Zusätzlich kodieren wir Betreff und Namen von Empfänger und Absender mit dem oben vorgestellten Verfahren. Mehr Information darüber, wie man in PHP E-Mails versendet, gibt es hier.

AntwortenPositivNegativ

Über den Autor

AvatarSoftware von Stefan Trost finden Sie auf sttmedia.de. Benötigen Sie eine individuelle Software nach Ihren eigenen Wünschen? Schreiben Sie uns: sttmedia.de/kontakt
Profil anzeigen

 

Ähnliche Themen

PHP: Eine E-Mail versenden

Tutorial | 0 Kommentare

Wie man Spam Mails vermeidet

Tipp | 0 Kommentare

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.