aetzchen: E-Mail Checken

Nachdem ich letzen Dresche bekommen hab für meine Art Emails zu checken versuche ich es jetzt auf eine andere Art.

In Netz habe ich folgende Funktion gefunden.

  
function checkEmail($email) {  
 // checks proper syntax  
 if(preg_match("#^([a-zA-Z0-9_\-])+(\.([a-zA-Z0-9_\-])+)*@((\[(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5]))\]))|((([a-zA-Z0-9])+(([\-])+([a-zA-Z0-9])+)*\.)+([a-zA-Z])+(([\-])+([a-zA-Z0-9])+)*))$#", $email)) {  
  // gets domain name  
list($username,$domain)=split('@',$email);  
  // checks for if MX records in the DNS  
 if(!checkdnsrr($domain, 'MX')) {  
  return false;  
}  
//attempts a socket connection to mail server  
if(!fsockopen($domain, 25,$errno,$errstr,30)) {  
  return false;  
  }  
  return true;  
 }  
 return false;  
}  

Leider funktioniert es nicht so ganz. Das heißt der Server gibt mir folgende Fehlermeldung.

Warning: fsockopen(): unable to connect to gmx.net:25.......

Hab schon überlegt auf die Verbindung zu verzichten aber halbe Sachen will ich dann doch nicht machen.

Woran könnte der Fehler liegen, bzw. kann ich fsockopen evtl. durch etwas anderes ersetzen?

Danke
Grüße

  1. //attempts a socket connection to mail server
    if(!fsockopen($domain, 25,$errno,$errstr,30)) {
      return false;

    Warning: fsockopen(): unable to connect to gmx.net:25.......

    Woran könnte der Fehler liegen

    1. Du holst nun schon die von fsockopen() geliefert Fehlermeldung ab und lagerst sie in $errstr, warum gibst du sie nicht aus?

    2. Unter gmx.net läuft kein Mailserver. Wo die Mailserver von GMX zu erreichen sind, erfährst du, indem du die entsprechenden DNS-Einträge mittels getmxrr() ausliest.

  2. Hinsichtlich der richtigen Syntax gibt's einen netten [url=http://aktuell.de.selfhtml.org/artikel/programmiertechnik/email/index.htm]Feature-Artikel[/url] im Selfraum. (Wenn ich Deinen RegExp richtig überflogen habe, dann prüfst Du z.B. keine TLDs).

    Via Kommunikation mit Mailserver zu prüfen ist (inzwischen) nicht mehr tauglich. Durch [url=http://de.wikipedia.org/wiki/Greylisting]Greylisting[/url] antworten Dir nämlich viele Server nicht mehr, wie erwartet, sondern lehnen die Annahme (erst einmal) ab  => Dein Check scheitert.

    Eine (aus Usersicht nervige) Variante der Prüfung wäre via Bestätigungsmail. Kommt immer auch drauf an, wie wichtig die Mailadresse ist bzw. wieviel Aufwand es dem User dann auch wert ist.

    Viele Grüße

    1. Danke für die Antworten.

      Ich prüf jetzt so (nicht schlagen wenns falsch ist;-).

        
      function checkEmail($email) {  
       // checks proper syntax  
       if(preg_match("#^([a-zA-Z0-9_\-])+(\.([a-zA-Z0-9_\-])+)*@((\[(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5]))\]))|((([a-zA-Z0-9])+(([\-])+([a-zA-Z0-9])+)*\.)+([a-zA-Z])+(([\-])+([a-zA-Z0-9])+)*))$#", $email)) {  
        // gets domain name  
      list($username,$domain)=split('@',$email);  
        // checks for if MX records in the DNS  
       if(!checkdnsrr($domain, 'MX')) {  
        return false;  
      }  
      //attempts a socket connection to mail server  
      if(!getmxrr($domain,&$mx_hosts,&$host_wt)) {  
        return false;  
        }  
        return true;  
       }  
       return false;  
      }  
      
      

      Sollte eigentlich gehen. Mit der regex werd ich mich nochmal auseinander setzen.

      Danke

      1. // checks for if MX records in the DNS
        if(!checkdnsrr($domain, 'MX')) {

        //attempts a socket connection to mail server
        if(!getmxrr($domain,&$mx_hosts,&$host_wt)) {

        Du kannst dir entweder !checkdnsrr() oder !getmxrr() sparen, denn beide holen lediglich die MX-Einträge, du prüfst also zweimal dasselbe.
        Vorhin nicht eingefallen ist mir, dass das Verlangen des Vorhandenseins eines MX-Eintrags gegen die Regeln ist. Ein Host ohne MX-Einträge nimmt E-Mail unter seiner eigenen Domain an. Insofern müsste diese Prüfung komplett raus.

        Die Angabe von $host_wt bei getmxrr() ist davon abgesehen für deinen Bedarf überflüssig.

        Lies dir die Anleitung doch bitte ordentlich durch. Du findest dort auch verschiedene Beispiele, wie man E-Mail-Adressen direkt beim Server verifiziert, was ich allerdings nicht rate, da man hier und da in Verbindung in eine Teerfalle tappt und minutenlang festgehalten wird, das Skript also zu hängen scheint.

        Ich würde summa summarum lediglich so weit gehen und erst schauen, ob MX-Einträge für die Domain vorhanden sind, und anschließend entweder mit einem MX-Eintrag oder, falls keine vorhanden, mit der Domain selber, mittels gethostbyname() prüfen, ob die Domain bekannt ist.
        Man könnte dann noch einen draufsetzen und per fsockopen() prüfen, ob der Server erreichbar ist, aber da sehe ich wenig bis gar keinen Nutzen drin, schon alleine, weil das Verbindungsproblem nur vorübergehend sein könnte.