PHP E-Mail adresse auf Gültigkeit überprüfen

27o8

abgemeldet
2 Mai 2006
9.028
933
Hi,
ich suche eine gute Möglichkeit eine E-Mail Adresse auf Existenz zu überprüfen. Ich habe hierzu in den Kommentaren der Doku folgende Funktion gefunden:

PHP:
function send_command($fp, $out){

  fwrite($fp, $out . "\r\n");
  return get_data($fp);
}

function get_data($fp){
  $s="";
  stream_set_timeout($fp, 2);

  for($i=0;$i<2;$i++)
    $s.=fgets($fp, 1024);

  return $s;
}


function validate_email($email){
   $mailparts=explode("@",$email);
   $hostname = $mailparts[1];

   // validate email address syntax
   $exp = "^[a-z\'0-9]+([._-][a-z\'0-9]+)*@([a-z0-9]+([._-][a-z0-9]+))+$";
   $b_valid_syntax=eregi($exp, $email);

   // get mx addresses by getmxrr
   $b_mx_avail=getmxrr( $hostname, $mx_records, $mx_weight );
   $b_server_found=0;

   if($b_valid_syntax && $b_mx_avail){
     // copy mx records and weight into array $mxs
     $mxs=array();

     for($i=0;$i<count($mx_records);$i++){
       $mxs[$mx_weight[$i]]=$mx_records[$i];
     }

     // sort array mxs to get servers with highest prio
     ksort ($mxs, SORT_NUMERIC );
     reset ($mxs);

     while (list ($mx_weight, $mx_host) = each ($mxs) ) {
       if($b_server_found == 0){

         //try connection on port 25
         $fp = @fsockopen($mx_host,25, $errno, $errstr, 2);
         if($fp){
           $ms_resp="";
           // say HELO to mailserver
           $ms_resp.=send_command($fp, "HELO microsoft.com");

           // initialize sending mail
           $ms_resp.=send_command($fp, "MAIL FROM:<[email protected]>");

           // try receipent address, will return 250 when ok..
           $rcpt_text=send_command($fp, "RCPT TO:<".$email.">");
           $ms_resp.=$rcpt_text;
          
           if(substr( $rcpt_text, 0, 3) == "250")
             $b_server_found=1;

           // quit mail server connection
           $ms_resp.=send_command($fp, "QUIT");

         fclose($fp);

         }

       }
    }
  }
  return $b_server_found;
}
Ist diese Idee vom Prinzip her gut, oder bringt eine solche Validierung auch Nachteile? Mal abgesehen davon, dass die Überprüfung ~3 Sekunden dauert.

Ich würde die Funktion noch etwas umschreiben sodass als erstes die Syntax geprüft wird und die weiteren Funktionen (explode, getmxrr) erst ausgeführt werden, wenn die Syntax korrekt ist.

Aber diese "Arbeit" möchte ich mir nur machen, wenn diese Funktion wirklich Sinn macht. Meiner Meinung nach ist das eine ziemlich gute Methode. Habe es vorhin an einer Vielzahl an Mail Adressen ausprobiert und konnte keinerlei Probleme feststellen. Aber vllt. kennt ihr ja noch welche ;)

*edit*
Selbstverständlich möchte ich mit dieser Funktion nicht das DOI ersetzen.
 
Zuletzt bearbeitet:
...

Darf ich Dir auch die Frage stellen, ob es überhaupt gross Sinn macht, eMails zu validieren, oder ist das nicht in Deinem Sinne?
 
Also im Grunde schon, aber viele Mailserver werden dir nicht verraten ob eine Addresse gueltig is oder ned, also kannst du's auch gleich bleiben lassen.
 
Solche Funktionen laufen in einer Vielzahl von Fällen nicht. Check nur den Aufbau der Mailaddi und schick einen Validierungslink an die Mailaddi. Das ist der einzig sichere Weg zu testen ob eine Mailaddi wirklich existiert UND der User darauf Zugriff hat ;)
 
Ich seh da schon Probleme mit der Syntax: Keine Umlaute erlaubt.
Streng genommen dürfen nach RFC nicht auswendig weiß keine Umlaute im @-Teil sein; jeder Mailserver is da aber anders konfiguriert. Mein Hoster z.B. erlaubt sie. Gebe ich eine solche Adresse ein, hab ich Probleme bei deiner Seite weiterzukommen.

Seit ein paar Jahren sind ja auch Umlaut-Domains für TLD .de zulässig. Jemand mit einer solchen Domain hat null Chance was zu machen, da jede Adresse von diesem Host von dir verworfen wird.

(Man muss dir zu Gute halten, dass du wenigstens Subdomains zulässt. Ich hab schon mehrfach Probleme gehabt, mich auf Seiten anzumelden, da mein Hostname zwei Punkte enthält und die Webmaster einfach zu doof sind, das zuzulassen :-?)

Betreffender deiner Fragen würd ich mich den obigen Posts anschließen:
Am sichersten und auch am einfachsten ist es, wenn du ne Bestätigungsmail an die Adresse schickst. "Antwortet" jemand von da, indem er einen Link aus der Mail klickt, weißt du

  1. die Adresse is gültig
  2. vermutlich wird ein Mensch vor dem Rechner sitzen
Ist 2. für dich wichtig, baust du einfach mehrere Klicks ein, wo 4 von 5 zur Sperrung führen und nur einer der richtige Link is.
 
Hi,
sorry das ich mich nun erst melde. Es geht mir keineswegs darum, dass ich das DOI Verfahren abschaffen kann. Ich möchte jedoch schon im Vorfeld Tippfehler vermeiden. Trotz 2 Feldern wo man die Mail noch einmal eintippen muss habe ich oft so Sachen wie

[email protected] gemeint ist dann web.de :wall:

Und ich möchte den Usern dann schon bei der Anmeldung zeigen: Achtung die E-Mail ist falsch!

Weil in der Regel ist es so, dass ich dann nach paar Stunden eine Mail erhalte wo mir Unfähigkeit vorgeworfen wird, und mein Script nicht einmal eine E-Mail verschicken könnte :wall: und sowas muss ja nicht sein ;)
 
[...]
[email protected] gemeint ist dann web.de :wall:

Und ich möchte den Usern dann schon bei der Anmeldung zeigen: Achtung die E-Mail ist falsch!

Weil in der Regel ist es so, dass ich dann nach paar Stunden eine Mail erhalte wo mir Unfähigkeit vorgeworfen wird, und mein Script nicht einmal eine E-Mail verschicken könnte :wall: und sowas muss ja nicht sein ;)

Dann zeigst du dem User, dass er zweimal zu blöd war seine Mailadresse richtig einzutragen. Verbiete z.b. das kopieren und einfügen in das Fenster, meistens wird eh copy'n'paste benutzt für Bestätigungsfelder, die Fehlerquelle könntest du damit ausschalten.
 
Du kannst ja ne "Suggestion-Whitelist" machen, um solche Flüchtigkeitsfehler auszuschließen. Niemals darfst du dich aber drauf festlegen, dass es ein Tippfehler is, nur weil die Ähnlichkeit groß is. Die Domain eb.de ist wirklich vergeben, d.h. die eMail-Adresse könnte wirklich gültig sein.
Verbiete z.b. das kopieren und einfügen in das Fenster, meistens wird eh copy'n'paste benutzt für Bestätigungsfelder, die Fehlerquelle könntest du damit ausschalten.
a) Wie willst du das verhindern?
b) So ne Seite hat mich dann nur einmal gesehen :roll:

Ich hasse solche Leute, die mir Vorschriften machen wollen und in die Browser-Grundfunktionen eingreifen wollen. Das hat dieselbe Stufe wie Statuszeilenänderung, um Link-URLs zu verschleiern, oder Pseudo-Schutz vor Codeklau, indem man mir mein Kontextmenü verbieten will :evil:

Du darfst dem Benutzer gerne assistieren. Du solltest ihn aber nie bevormunden!
 
Kopiere mal ein PW-Feld ... - die Grundfunktion ist in Browsern durchaus verbreitet.
Das stellt schon das Betriebssystem sicher (Windows: ES_PASSWORD-Flag gesetzt für das Passworteingabe-Window).

Du hast das aber für die eMail-Adresse vorgeschlagen. Du kannst sie gerne dem Benutzer in *********************-Form eintippen lassen. Die Chance, dass er sich vertippt, wird wohl nahe 99% sein - also erreichst du genau das Gegenteil.
 
[...]
Du hast das aber für die eMail-Adresse vorgeschlagen. Du kannst sie gerne dem Benutzer in *********************-Form eintippen lassen. Die Chance, dass er sich vertippt, wird wohl nahe 99% sein - also erreichst du genau das Gegenteil.

Mail eingeben: XXX
Mail wiederholen: XXX - kein copy'n'paste - haben viele größere Seiten. Da sehe ich auch kein Problem.
 
Ich wuerde mich meinen vorschreibern anschliessen und nicht zuviel machen, aber alles Zulassen.

In diesem Fall wuerde ich einfach den DNS Record checken ob zu der Domain ein gueltiger MX-Record dabei is, aber den User nur darauf hinweisen dass du meinst es sei ein Fehler, aber stoss ihn nicht vor den Kopf :mrgreen:
 
Ja ich dachte bei so einer Überprüfung mehr an eine Infobox welche erscheint wenn ein Fehler erkannt wird. Dazu dann ein Hinweis, dass man noch einmal überprüfen soll, und falls es doch stimmt einfach noch einmal abschicken. :)