barrierefreies Webdesign Ingo Turski

zum Inhalt

Ingo

Tips und Tricks:E-Mail-Adressen prüfen

Im Netz kursieren etliche Scripts, die eingegebene E-Mail-Adressen auf ihre Gültigkeit prüfen. Die meisten sind völlig untauglich, da sie auch gültige Adressen abweisen; spätestens mit der Einführung von nicht-englischen Adresszonen durch die ICANN Internet Corporation for Assigned Names and Numbers:
ICANN entscheidet über die Grundlagen der Verwaltung
der Top Level Domains und auf diese Weise
koordiniert ICANN technische Aspekte des Internet.
 sind alle bisherigen (zu strengen) Prüfungen untauglich.

Wozu überhaupt prüfen? Selbst eine komplexe Syntaxprüfung, die alle aktuellen Top Level Domains berücksichtigt, kann nicht sicherstellen, dass die angegebene Adresse auch existiert. Eine Syntaxprüfung kann also nur zwei Funktionen erfüllen: auf offensichtliche Eingabefehler hinweisen und, falls die Adresse im Mailheader verwendet werden soll, Manipulationen desselben verhindern.

Eine E-Mail-Adresse besteht aus drei Teilen: dem lokalen Empfängernamen, dem Zeichen »@« und einer Domain oder IP. Der Empfängername kann auch zusätzlich einen in Anführungszeichen gesetzten Anzeigenamen enthalten, was aber in Formularen so selten genutzt wird, dass diese Option bei der Prüfung vernachlässigt werden kann. Es reicht also als einfaches Suchmuster eine Zeichenkette ohne „kritische“ Zeichen, gefolgt von einem »@«, gefolgt von einer grob geprüften Domainangabe oder IP:

<?php
function checkEmail($adr) {
  $regEx = '/\A([^\s@,:"<>]+)@([^\s@,:"<>]+\.[^\s@,:"<>.\d]{2,}|\[(\d{1,3}\.){3}\d{1,3}\])\z/';
  return (preg_match($regEx,$adr,$part)) ? $part : false;
}
?>

Diese Funktion liefert bei einer grob fehlerhaften oder potentiell gefährlichen Adresse false zurück und ansonsten ein Array mit dem Empfängernamen in $part[1] und der Domain oder IP in $part[2].
[^\s@,:"<>]+ prüft, ob im Empfängernamen kein Whitespace (insbesondere kein Zeilenumbruch, weshalb im PHP-Code \z als Endekennzeichen steht und nicht $, was vor einem Zeilenumbruch enden und diesen durchlassen würde!) und keine der folgenden Zeichen enthalten sind: »@« (doppelt), aus dem Mailheader fernzuhaltende Kommata oder Doppelpunkte, versehentlich eingegebene Anführungszeichen und in einer HTML-Ausgabe unerwünschte spitze Klammern.
Die gleiche Prüfung erfolgt nach dem @ für den Domainnamen und nach dem letzten . für die TopLevelDomain mit mindestens zwei Zeichen, die keinen Punkt oder Ziffern enthalten darf. \[(\d{1,3}\.){3}\d{1,3}\] prüft, ob alternativ zu einer Domain eine IP angegeben ist, die in eckigen Klammern eingeschlossen ist und aus vier durch Punkte getrennte maximal dreistellige Ziffernfolgen besteht.

Das Suchmuster ist relativ grob, erkennt aber die meisten unbeabsichtigten Fehleingaben und verhindert zuverlässig Manipulationen, die ein MailScript zur „Spamschleuder“ werden lassen.
Andererseits werden keine noch so ungewöhnlichen Adressen abgewiesen wie von anderen E-Mail-Prüfungen.

Sollten Sie die Adresse in einem Mail-Header verwenden, empfiehlt sich eine strengere Prüfung. Die folgenden Suchmuster prüfen weitgehend auf RFC-Konformität, weisen jedoch auch zulässige Umlaute und Sonderfälle im lokalen Part ab, was andererseits den Vorteil hat, dass die Adresse ohne RFC-konforme Umwandlung genutzt werden kann.

<?php
function checkEmailRFC($adr) {
  $regEx = "/\A([a-z0-9.!#$%&'*+\/=?^_`{|}~-]{0,64})@([a-z0-9.-]{0,63}\.[a-z]{2,18}|\[(?:\d{1,3}\.){3}\d{1,3}\])\z/i";
  $testLocal = "/(^\.|\.\.|\.$)/"; $testDomain = "/(^(\.|-)|(\.|-)(\.|-)|(\.|-)$)/";
  return (
    preg_match($regEx,$adr,$part)
    && !preg_match($testLocal,$part[1]) && !preg_match($testDomain,$part[2])
    && checkdnsrr($part[2])
  ) ? $part : false;
}
?>

Zunächst wird hier geprüft, ob die E-Mail eine passende Anzahl zulässiger Zeichen enthält und die Domain syntaktisch korrekt ist. Dann wird zusätzlich noch getestet, ob Punkte und in der Domain Bindestriche unzulässig am Anfang, aufeinanderfolgend oder am Ende vorkommen.
Die letzte Prüfung der DNS-Einträge auf Existenz der Domain können Sie weglassen, wenn sie zu zeitraubend sein sollte und Sie eine dadurch mögliche (D)DoS (Distributed) Denial of Service:
Serverüberlastung durch zuviele Anfragen, meist als Folge eines Hackerangriffs.
-Gefahr auszuschließen wollen.

Hier das JavaScript für den einfachen Check (zur strengen Prüfung das Suchmuster ersetzen):

<script type="text/javascript">
function checkEmail(adr) {
  var rx = /^([^\s@,:"<>]+)@([^\s@,:"<>]+\.[^\s@,:"<>.\d]{2,}|\[(\d{1,3}\.){3}\d{1,3}\])$/;
  var part = adr.value.match(rx);
  var info = 'E-Mail-Adresse ';
  if(part) info += '<'+part[1]+'@'+part[2]+'> ist OK.';
  else { info += 'ist fehlerhaft!'; adr.focus(); }
  document.getElementById('checkEmail').innerHTML = info;
}
</script>

<p id="checkEmail">Testen Sie das Suchmuster mittels Javascript:</p>
<form action=""><p>
  <input type="text" name="adr" size="35" value="" />
  <input type="button" value="checkEmail" onclick="checkEmail(this.form.adr)" />
</p></form>

Sie können das JavaScript als Vorprüfung verwenden, um den Benutzer bereits vor dem Versenden des Formulars auf Fehler hinzuweisen und das E-Mail-Feld zur Korrektur fokussieren.