Kategorien
Webanwendungen Webdesign & Coding

Mailversand mit PHP

Der Mailversand mit PHP ist eigentlich ganz einfach, denn es gibt die Funktion mail(), der man einfach die Parameter, z.B. auf einem Formular, übergibt und schon geht es. Problematisch wird es aber schnell, wenn Umlaute in Namen, Betreff oder Nachrichtentext vorkommen und diese in der Mail mit seltsamen Zeichen ersetzt werden. Hier ein paar Tipps und meine Lösung.

Mein ursprüngliches Ziel war, die Mails mit UTF-8 zu formatieren und entsprechend zu versenden. Nach vielen Versuchen bin ich zu dem Entschluss gekommen, UTF-8 an dieser Stelle aus dem Weg zu gehen und die Texte ISO-8859-1-kodiert aufzubereiten und zu versenden.

Ganz wichtig ist an dieser Stelle, dass sowohl die Texte, als auch die Metadaten im Mailkopf das gleiche Format haben. Mischt man hier Formate, z.B. UTF-8 mit einem ISO-Standard, dann erhält man meistens ebenfalls defekte Umlaute.  Ich konvertiere daher jede Eingabe erst von einem möglichen UTF-8 in CP1252, einem Superset von ISO-8859-1, und dann in Quoted Printable, da dieses Format bei meinen Versuchen am sichersten in verschiedenen Mailprogrammen (Outlook, The Bat!) dargestellt wurde.

Die Konvertierung in Quoted Printable erfolgt mit der Funktion quoted_printable_encode(), die erst ab PHP 5.4 zur Verfügung steht. Verwendet man noch eine ältere Version von PHP, dann muss man nach einer Funktionsdefinition suchen, die man jedoch direkt in der PHP-Dokumentation geliefert bekommt:

http://php.net/manual/de/function.quoted-printable-encode.php

Die Befehle stehen im Beispiel untereinander, können aber auch zusammengefasst werden.

Eine Auffälligkeit ist der Teil

"=?iso-8859-1?Q? ... ?=

im FROM-Teil des Mail-Headers. Dies war notwendig, um in allen getesteten Mailprogrammen Umlaute im Namen sichtbar zu machen. Abgeschaut habe ich mir diesen Eintrag in der Ausgabe anderer Mailprogramme. An sich sieht es auf wir doppelt gemoppelt, aber so funktioniert es bei mir.

Aus Sicherheitsgründen sollte man daran denken, die Benutzereingaben zu filtern, um dem Missbrauch des eigenen Mailscripts als Spam-Schleuder vorzubeugen. Denkbar ist hier ein

htmlspecialchars(strip_tags($text), ENT_QUOTES);

Nachfolgend das Script zum Mailversand, noch ohne Sicherheitsfilterung:

<?php
/*
 Mailversand 1.0 by MarkusN [18.07.2013]
*/
$empfaenger = "mail-adresse@meine-domain.de";
$name = $_POST["name"];
$name = iconv("UTF-8", "CP1252", $name);
$name = quoted_printable_encode($name);

$email = $_POST["email"];

$betreff = $_POST["betreff"];
$betreff = iconv("UTF-8", "CP1252", $betreff);
$betreff = quoted_printable_encode($betreff);

$nachricht = $_POST["nachricht"];
$nachricht = iconv("UTF-8", "CP1252", $nachricht);
$nachricht = quoted_printable_encode($nachricht);
$header  = "From: =?iso-8859-1?Q?".$name."?= <".$email.">"."\r\n";
$header .= "Mime-Version: 1.0\r\n";
$header .= "Content-Type: text/plain; charset= ISO-8859-1\r\n";
$header .= "Content-Transfer-Encoding: quoted-printable";

$nachricht = "Name: ".$name."\nE-Mail: ".$email."\nBetreff:".$betreff."\n\n".$nachricht;

$mn_mailversendet = mail($empfaenger, $betreff, $nachricht, $header);
if ($mn_mailversendet) {
echo "Mail erfolgreich versendet.";
} else {
echo "Es ist ein Problem beim Mailversand aufgetreten.";
}
?>

 

Mögliche Erweiterungen

Eingabeprüfung der Formularfelder mit jQuery

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert