E-Mail Formulare richtig umsetzen…
Was ist eigentlich bei der Umsetzung von E-Mailformularen auf Webseiten zu beachten?
Eine ganze Menge!
Um unseren Hostingkunden diese Dinge nicht immer wieder vom neuen erklären zu müssen, haben wir folgenden Artikel über die richtige Umsetzung von E-Mail Formularen verfasst.
- Empfängeradresse
- Absenderadressen und Namen
- Betreffzeilen
- Kodierung
- HTML
- Return-Path
1. Empfängeradresse
Die Empfängeradresse ist niemals durch den Benutzer festzulegen, da ein Formular so 100%ig zum Versand von Spam missbraucht wird. Die Empfängeradresse ist also fest im Programmcode zu codieren. Versteckte HTML-Formularfelder oder $_GET-Parameter sind ebenfalls nicht geeignet, da sie sehr leicht durch einen Angreifer manipuliert werden können.
2. Absenderadresse und Name
Jede Absenderadresse, die ein Benutzer eingeben darf, ist auf Gültigkeit zu überprüfen. Es reicht ausdrücklich nicht aus, dass die Adresse ein @-Zeichen enthält. Eine Überprüfung mittels regulärem Ausdruck ist Pflicht!
Eine Prüfung kann in PHP beispielsweise wie folgt aussehen:
preg_match(“/^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[a-z]{2,4}|museum|travel)$/i”, $adresse)
Im Falle, dass die Adresse gültig ist, gibt preg_match true, im Fehlerfall false zurück.
Was auf gar keinen Fall in der Absenderadresse erlaubt sein darf, ist das Einfügen von Zeilenumbrüchen. Die Verwendung von <input>-Tags reicht hier nicht aus, da ein Angreifer trotzdem Zeilenumbrüche einschleusen kann. Dadurch ist es einem Angreifer möglich, einer E-Mail beliebige Headerzeilen, beispeilsweise eine To: <empfänger> Zeile, hinzuzufügen. Hierdurch kann ein E-Mailformular zum massenhaften Versandt von Spam missbraucht werden.
3. Betreffzeilen
Betreffzeilen dürfen ausschließlich 7-Bit ASCII-Code enthalten. Also kein ä ö ü ß oder ähnliches!
Sonderzeichen müssen generell umkodiert werden.
In PHP ist dies beispielsweise mit der Funktion mb_convert_encoding möglich.
$betreff = mb_convert_encoding($betreff, “ASCII”, “UTF-8″);
Auch in der Betreffzeile darf auf gar keinen Fall ein Zeilenumbruch akzeptiert werden!
Hier gilt das selbe wie bei der Absenderadresse!
4. Kodierung
Die Kodierung einer E-Mail ist stets im Header anzugeben!
Fehlende Header führen immer wieder zu nicht ordnungsgemäß darstellbaren E-Mails.
Der Entwickler merkt dies meist nicht. Er erstellt seine E-Mails beispielsweise in UTF-8, und liest diese auch mit seinem UTF-8 Client. Die Darstellung ist dann natürlich korrekt. Öffnet nun aber jemand mit einem ISO-8859-1 Client diese E-Mails, sieht er statt Umlauten nur schwarze Kästchen oder Fragezeichen. Professionell wirkt dies definitiv nicht! Zuletzt erlebten wir so eine Sache mit dem Carsharing der Deutschen Bahn. Hier fehlte die Kodierungsangabe, und in allen E-Mails wurden die Umlaute bei uns nicht korrekt dargestellt!
Die Kodierung gehört also in den Header der E-Mail eingebaut. Beispielsweise so:
Content-Type: text/plain; charset=utf-8
Selbstverständlich ist auf die Verwendung des richtigen Zeichensatzes zu achten!
Zum Schluss möchten wir noch anmerken, dass fehldende Kodierungsangaben von Spamfiltern gerne bestraft werden, da normale Mailclients stets die Kodierung in den Mailheader einbauen!
5. HTML
HTML in E-Mails ist eine tolle Sache, würde Sie nur richtig verwendet werden. Der HTML-Code gehört nicht einfach in den Mailbody. Es gibt da draußen nicht gerade wenige Leute, die keine HTML Mails öffnen. Enthält die E-Mail jedoch anstelle des Textes einfach nur HTML-Code, sieht der Benutzer einfach nur HTML-Code und wird der E-Mail keine besondere Beachtung schenken.
HTML E-Mails sind stets als Multipart-Messages zu versenden! Wir Empfehlen folgenden Artikel: http://www.webcheatsheet.com/php/send_email_text_html_attachment.php
6. Return-Path
Die Angabe eines Return-Path im Mailheader ist beim Versand von E-Mails über einen Webserver unerlässlich. Kann eine E-Mail beispielsweise nicht zugestellt werden, erzeugt der Mailserver eine Bounce-Nachricht an den Absender. Dies ist im Normalfall der Webserver, was zur Folge hat, dass diese Nachricht nicht zugestellt werden kann. Ist im Header eine Return-Adresse angeben, werden die Bounce-Mails an diese Adresse versandt. Eine Headerzeile für einen Return-Path sieht wie folgt aus:
Return-Path: <benutzer@domain.tld>
So bemerkt der Webmaster auch, wenn eine E-Mail nicht zugestellt werden konnte.