[PHP] Emailadresse auf korrektheit prüfen / validieren

Dieser Beitrag ist auch verfügbar in: Englisch

Hallo zusammen,

fast auf jeder Webseite gibt es ein Feld wo der Besucher seine Emailadresse eingeben soll. Ob in einem Kontaktformular, für die Anmeldung bei einem Newsletter oder für die Anmeldung zu einem Mitgliederbereich. Es gibt Anwendungen wo dies nötig ist.

Wir müssen in jedem Fall die Emailadresse prüfen. Ob Sie vom Aufbau her korrekt ist (nicht das der User ausversehen die Felder verwechselt hat und hier eine Internetadresse eingegeben hat) und wie können prüfen ob es die dazugehörige Domain überhaupt gibt. Schreibfehler in der Emailadresse können wir jedoch leider nicht prüfen… bzw. dies nur mit einem Aufwand der sich nicht mehr rentiert.

Hier eine einfache Funktion zum prüfen der Emailadresse:

function mailCheck($email) { 
	return preg_match("/^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-.]+.([a-zA-Z]{2,4})$/", $email); 
}

Bei dieser Funktion wird lediglich geprüft ob der Syntax der Emailadresse korrekt ist. Das heißt ob das “@”-Zeichen an der richtigen Stelle ist, ob eine TLD vorhanden ist. Ob die Domain vorhanden ist wird hier noch nicht geprüft.

Hier nun eine erweiterte Funktion:

function mailcheckDNS($mail) { 
	$email = htmlspecialchars($mail); 
	$r = false; 
	if(preg_match('/(.*?)@(.*?).(w){2,6}/i', $email)) { 
		$split = explode('@', $email); 
		$split2 = explode('.', $split[1]); 
		if(preg_match('/([a-z]){3,64}/i', $split2[0])) { 
			if(preg_match('/([a-z0-9!"$&/()?~#+.:_-]+){1,64}[^@]/i', $split[0])) { 
				$MXCheck = getmxrr($split[1], $mxhosts); 
				if(!empty($MXCheck)) { 
					$r = true; 
				} 
			} 
		} 
	} 
	return $r; 
}

Diese überprüft nun zusätzlich ob die Domain überhaupt existiert indem sie versucht diese zu erreichen. Ist dies möglich dann fällt die Überprüfung positiv aus, wenn nicht dann negativ.

Es gibt keinen 100%igen Emailcheck, aber was man prüfen kann das sollte man auch. Rechtschreibfehler kann man einfach nicht prüfen. Dafür könnten man z.B. den User die Emailadresse 2 mal eingeben lassen, zur Sicherheit.

Gruß
Gordon


Hinweis: Die Verwendung meiner Codeschnipsel erfolgt auf eigene Gefahr! Ich übernehme auch keine Garantie auf Funktionstüchtigkeit (jeder Server ist anders konfiguriert. Bei Problemen können Sie hier aber gern einen Kommentar schreiben und wir suchen eine Lösung. ;)

15 Antworten
  1. Thomas says:

    Eine Anmerkung zur erweiterten Funktion:

    Die Domain einer Email-Adresse muss nicht zwingend auch per HTTP (Port 80) erreichbar sein. Daher wäre ein Check mit getmxrr() zur Ermittlung der zuständigen Mailserver besser.

    Antworten
  2. Gordon says:

    Hallo Thomas,

    danke fuer den Hinweis. Ich werde mich gleich nach Weihnachten drum kuemmern und das Script ueberarbeiten. Ich kannte die Funktion noch gar nicht. Man lernt halt nie aus :)

    Antworten
  3. Jannes says:

    Hallo,
    Ich habe die Funktion ausprobiert und folgende Fehlermeldung kassiert:
    Deprecated: Call-time pass-by-reference has been deprecated in C:\Program Files\xampp\htdocs\formularauswertung.php on line 18.
    Kann mir da vielleicht jemand helfen, wie ich die wieder wegbekomme?
    Schon mal danke im vorraus,
    Jannes
    

    Antworten
  4. Gordon says:

    Hallo James,

    ich habe es jetzt bei mir lokal auch mal probiert. Bei mir steht in der angemeckerten Zeile aber:

    $MXCheck = getmxrr($split[1], &$mxhosts);

    Und ich denke hier könnte der Fehler zu finden sein. Ändere die Zeile mal wie folgt um:

    $MXCheck = getmxrr($split[1], $mxhosts);

    Und gucke mal ob es damit geht.

    Viele Grüße
    Gordon

    Antworten
  5. Gordon says:

    Damit hast Du nur die Ausgabe der Fehlermeldung unterdrückt, nicht aber das Problem gelöst. Das Problem besteht weiter.
    Ich habe jetzt aber auch keine Lösung dafür, da es bei mir nicht Auftritt.

    Antworten
  6. MajorX says:

    Hallo Gordon,
    ich hatte jetzt das gleiche Problem wie Jannes, genau die gleiche Fehlermeldung, aber mit deiner änderung “$MXCheck = getmxrr($split[1], $mxhosts);” funktioniert das jetzt Prima!

    DANKE für das Script! Denn preg_match + Syntax = *würg*

    Antworten
  7. Sebastian says:

    top Funktion! Erstmalig seit Jahren copy & paste und go! Zumal es Sinn macht über den Syntax der Mailadresse hinaus auch die Domain auf Existenz zu prüfen. Kann man eigentlich nicht mehr den Usernamen fingern? Ging das nicht früher mal? *grübel*

    Gruß
    Sebastian

    Antworten
    • Gordon says:

      Hallo Andy,

      das Script prüft in der Version oben nur die Second Level Domain. Nicht die Third Level. Ich weiß nicht ob es funktioniert, aber Du könntest folgendes mal probieren (kann es jetzt nicht testen):

      function mailcheckDNS($mail) {
      $email = htmlspecialchars($mail);
      $r = false;

      if(preg_match(‘/(.*?)\@(.*?)\.(\w){2,6}/i’, $email)) {
      $split = explode(‘@’, $email);
      if(preg_match(‘/([a-z0-9\!\"\$\&\/\(\)\?\~\#\+\.\:\_\-]+){1,64}[^\@]/i’, $split[0])) {
      $MXCheck = getmxrr($split[1], $mxhosts);
      if(!empty($MXCheck)) {
      $r = true;
      }
      }
      }
      return $r;
      }

      Dabei gibt es keine überprüfung der Domain. Könnte funktionieren.

      Antworten
  8. nk says:

    „Dafür könnten man z.B. den User die Emailadresse 2 mal eingeben lassen, zur Sicherheit.“

    Ganz ehrlich, gibt es wirklich Leute, die das manuell (ein zweites mal) eintippen?

    Antworten
    • Gordon says:

      Es ist auf vielen Webseiten so das man die E-Mail Adresse wiederholen muss (gerade bei Anmeldeformulaten). Ob man das auf seiner eigenen Webseite auch so macht bleibt ja jedem selbst überlassen.
      Und wenn der User sich zufällig vertippt (gewollt oder nicht) dann hat man hinterher keine Möglichkeit mehr ihn zu kontaktieren. Dann lieber 2 mal eingeben lassen und mögliche Vertipper ausschließen.

      Antworten

Hinterlassen Sie einen Kommentar

Wollen Sie an der Diskussion teilnehmen?
Wir freuen uns über ihren Beitrag!

Hinterlasse eine Antwort

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


*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>