Marco: E-Mailadresse überprüfen ob gültig !!

Hallo zusammen,

ich suche das Script um eine E-Mailadresse nach seiner gültigkeit zu überprüfen. Habe das mal hier im Formu gesehen aber leider finde ich es nicht mehr !!

Freue mich auf Eure Antworten !!

Gruss Marco

  1. Hallo zusammen,

    ich suche das Script um eine E-Mailadresse nach seiner gültigkeit zu überprüfen. Habe das mal hier im Formu gesehen aber leider finde ich es nicht mehr !!

    Freue mich auf Eure Antworten !!

    Gruss Marco

    hier ein ganz simples

    function email($text)  {
    if(!eregi("^([a-z0-9\_-.]+)@([a-z0-9]+).([a-z]+)",$text,$regs)) return -1;
    if(strlen($regs[3]) >= 2 && strlen($regs[3]) <= 4) return 0;
    return -1;
    }

    1. Aloha!

      hier ein ganz simples

      So simpel, dass es fälschlich korrekte EMail-Adressen ablehnt. Was wäre z.B. mit "username.nachname@subdomain.domain.de"?

      function email($text)  {
      if(!eregi("^([a-z0-9\_-.]+)@([a-z0-9]+).([a-z]+)",$text,$regs)) return -1;
      if(strlen($regs[3]) >= 2 && strlen($regs[3]) <= 4) return 0;

      Dass kann man auch direkt in dein RegExp packen. Und merke: Es gibt TLDs, die länger als 4 Zeichen sind: ".museum" ist derzeit aktiv, weitere werden sicher folgen.

      return -1;
      }

      Merke: Schnellschüsse gehen schnell nach hinten los.

      - Sven Rautenberg

  2. Hi!
    das 1. prüft die Existenz der Domain..

    hier noch was:

    if(!empty($email)) {
       // domain pruefen
      if (!(strpos($email, "@") > 2) || !(strrpos($email, ".") > (strpos($email, "@") + 2)) || !(strlen(strrchr($email, ".")) >= 2) || !checkdnsrr (substr(strrchr($email, '@'), 1), 'MX')) {
             $fehlerausgabe .= "<li>keine gültige Domain für die e-Mailadresse angegeben";
         }
         if (!(strcspn($email, "!"§$%&/()=?{[]}\üöäß*';:,") == strlen($email))) {
             $fehlerausgabe .= "<li>ungültige Zeichen (z.B. §, $, %,&, /, (, (, ä, ö, ä) in der e-Mail Adresse";
         }
     }

    Steffi

    1. Aloha!

      if(!empty($email)) {
         // domain pruefen
        if (!(strpos($email, "@") > 2) || !(strrpos($email, ".") > (strpos($email, "@") + 2)) || !(strlen(strrchr($email, ".")) >= 2) || !checkdnsrr (substr(strrchr($email, '@'), 1), 'MX')) {
               $fehlerausgabe .= "<li>keine gültige Domain für die e-Mailadresse angegeben";

      Ganz trickreich, einfach den Nameserver abzufragen, ob er einen MX-Record für die Adresse enthält. Bringt aber letztendlich auch noch keine Gewißheit, ob die Mailadresse an sich existiert, sondern stellt nur sicher, dass niemand nicht-existente Domains eingegeben hat. Aber selbst wenn man sich heutzutage vertippt und statt t-online.de dummerweise t-offline.de eingibt, findet sich ein Server, der Mails bereitwillig entgegennimmt. :)

      }
           if (!(strcspn($email, "!"§$%&/()=?{[]}\üöäß*';:,") == strlen($email))) {
               $fehlerausgabe .= "<li>ungültige Zeichen (z.B. §, $, %,&, /, (, (, ä, ö, ä) in der e-Mail Adresse";
           }
      }

      Die Suche nach ungültigen Zeichen ist aber leider falsch. Ein " ist ein gültiges Zeichen, es kann den Usernamen einklammern, um darin z.B. Leerzeichen zu erlauben. Schätzungsweise sind alle druckbaren ASCII-Zeichen bis 127 erlaubt, sich in einem so umschlossenen Usernamen zu befinden. Ok, das ist eher ungewöhnlich, aber nicht ausgeschlossen - und ärgerlich für denjenigen, dessen richtige EMail-Adresse als falsch zurückgewiesen wird.

      - Sven Rautenberg

      1. Hi!

        if(!empty($email)) {
           // domain pruefen
          if (!(strpos($email, "@") > 2) || !(strrpos($email, ".") > (strpos($email, "@") + 2)) || !(strlen(strrchr($email, ".")) >= 2) || !checkdnsrr (substr(strrchr($email, '@'), 1), 'MX')) {
                 $fehlerausgabe .= "<li>keine gültige Domain für die e-Mailadresse angegeben";

        Ganz trickreich, einfach den Nameserver abzufragen, ob er einen MX-Record für die Adresse enthält.

        Wie genau geschieht das denn in der Abfrage? Was überseh ich da bzw. wo wird da ein DNS-Server abgefragt?

        Grüße,
        Heinz

        1. Aloha!

          if(!empty($email)) {
             // domain pruefen
            if (!(strpos($email, "@") > 2) || !(strrpos($email, ".") > (strpos($email, "@") + 2)) || !(strlen(strrchr($email, ".")) >= 2) || !checkdnsrr (substr(strrchr($email, '@'), 1), 'MX')) {
                   $fehlerausgabe .= "<li>keine gültige Domain für die e-Mailadresse angegeben";

          Ganz trickreich, einfach den Nameserver abzufragen, ob er einen MX-Record für die Adresse enthält.

          Wie genau geschieht das denn in der Abfrage? Was überseh ich da bzw. wo wird da ein DNS-Server abgefragt?

          checkdnsrr() heißt die Funktion. :) Ist das einzige, was in diesem Teil die Zeichen "dns" enthält - hättest du also auch selbst finden können. ;)

          - Sven Rautenberg

          1. Hallo!

            if(!empty($email)) {
               // domain pruefen
              if (!(strpos($email, "@") > 2) || !(strrpos($email, ".") > (strpos($email, "@") + 2)) || !(strlen(strrchr($email, ".")) >= 2) || !checkdnsrr (substr(strrchr($email, '@'), 1), 'MX')) {
                     $fehlerausgabe .= "<li>keine gültige Domain für die e-Mailadresse angegeben";

            Ganz trickreich, einfach den Nameserver abzufragen, ob er einen MX-Record für die Adresse enthält.

            Aber so wie ich die Kommentare im Manual deute muß ein Mailserver nicht unbedingt einen MX-Eintrag besitzen! Ein Beispiel aus den Kommentaren:

            if
            (eregi("[1]([-_.]?[0-9a-z])*@[0-9a-z][-.0-9a-z]*\.[a-z]{2,3}[.]?$",
            $string, $check)) {
             $host = substr(strstr($check[0], '@'), 1).".";
             if ( getmxrr($host, $validate_email_temp) )
              return TRUE;
             // THIS WILL CATCH DNSs THAT ARE NOT MX.
             if(checkdnsrr($host,"ANY"))
              return TRUE;
            }
            return FALSE;

            Wobei mir der reguläre Ausdrucg _NICHT_ gefällt, aber er fragt zuerst nach MX-Einträgen des Hosts, danach aber noch nach _ANY_ anderen DNS Einträgen. Müssen das alle sein, oder reichen da nicht bestimmte?

            Hier kommt eine Erklärung warum MX alleine nicht reicht und ein 2. Beispiel:

            If this function is going to be used for e-mail validation purposes; Please
            bear in mind that MX records are not mandatory and that RFC974 clearly
            states: If no MX records exist for a given host, MTAs should interpret
            this as if there is one MX RR matching the host itself. (I.e. you should
            call gethostbyname() to see if the host has an A record.)

            <?php
             $host=$host.".";
             if ( getmxrr( $host, $mxhosts ) == FALSE &&
                  gethostbyname( $host ) == $host ) {
                 echo "$host is not a valid e-mail host.";
              } else {
                 echo "$host is a valid e-mail host.";
              }
            ?>

            Dieses verstehe ich nicht so ganz. Er testet ob ein MX-Eintrag existiert, und wenn nicht ob der aufgelöste Host = dem zu prüfenden Host ist. Aber bringt das dann überhaupt noch was? Kann man das nicht besser beschränken?

            Noch eine Frage: Wer wird mit getmxrr() .. abgefragt? Ist man darauf angewiesen das der Server selbst online ist, oder fragt man nur irgendwelche Namenserver ab, die "immer" online sind?

            Zumindest reicht Steffis Version nicht aus, außerdem würde ich an Ihrere Stelle lieber positiv definieren was in einer Email Adresse stehen darf, denn umgekehrt erwischt man eh nicht alle Zeichen!

            Viele Grüße
            Andreas


            1. 0-9a-z_ ↩︎

            1. Aloha!

              Aber so wie ich die Kommentare im Manual deute muß ein Mailserver nicht unbedingt einen MX-Eintrag besitzen!

              Richtig. Fällt mir jetzt auch auf, dass diese Variante Müll ist.

              Wobei mir der reguläre Ausdrucg _NICHT_ gefällt, aber er fragt zuerst nach MX-Einträgen des Hosts, danach aber noch nach _ANY_ anderen DNS Einträgen. Müssen das alle sein, oder reichen da nicht bestimmte?

              Irgendwo muss das offizielle DNS-System ja einen IP-Eintrag haben für den Host-Teil der Mailadresse. Den gilt es zu finden, und dorthin sendet der Mailserver die Mail.

              Ach ja: Was passiert, wenn als Host-Teil eine IP-Adresse angegeben ist? Wäre gültig - nur dürfte das DNS-System keine IP-Adresse für die IP-Adresse finden, weil es nur IP-Adressen für Namen findet. Die IP-Adresse muss man nicht mehr in IP-Adressen auflösen. :)

              If this function is going to be used for e-mail validation purposes; Please
              bear in mind that MX records are not mandatory and that RFC974 clearly
              states: If no MX records exist for a given host, MTAs should interpret
              this as if there is one MX RR matching the host itself. (I.e. you should
              call gethostbyname() to see if the host has an A record.)

              Wenn für user@domain.tld (also "domain.tld") kein MX-Eintrag existiert (der sonst sagen würde, dass Mails primär an "mail.domain.tld" gehen sollen, und sekundär an "backup.provider.tld"), dann ist der Host "domain.tld" für Mails zuständig, und dahin wird gesendet.

              <?php
              $host=$host.".";
              if ( getmxrr( $host, $mxhosts ) == FALSE &&
                    gethostbyname( $host ) == $host ) {
                   echo "$host is not a valid e-mail host.";
                } else {
                   echo "$host is a valid e-mail host.";
                }
              ?>

              Dieses verstehe ich nicht so ganz. Er testet ob ein MX-Eintrag existiert, und wenn nicht ob der aufgelöste Host = dem zu prüfenden Host ist. Aber bringt das dann überhaupt noch was? Kann man das nicht besser beschränken?

              gethostbyname() liefert als Ergebnis die IP-Adresse des Namens. Kann der Name nicht aufgelöst werden, wird der Name zurückgeliefert.

              if (gethostbyname($host) == $host) prüft, ob aufgelöster Name und Name identisch sind. Wenn ja, ist die Auflösung fehlgeschlagen. Wenn nein, hat gethostbyname() eine IP-Adresse zurückgeliefert (hoffentlich).

              Noch eine Frage: Wer wird mit getmxrr() .. abgefragt? Ist man darauf angewiesen das der Server selbst online ist, oder fragt man nur irgendwelche Namenserver ab, die "immer" online sind?

              Alle Funktionen fragen DNS-Server ab. Man sollte bedenken:
              1. Die Befragung eines Nameservers dauert eine gewisse Zeit. Im schlimmsten Fall muss nämlich erst einer der Root-Server nach der Zuständigkeit für die TLD gefragt werden, und der NIC-DNS-Server dann nach der Domain, und der Nameserver der Domain dann nach dem MX-Eintrag bzw. dem Nameservereintrag (eine oder mehr Stufen weiter kann das Spielchen durchaus gehen, vor allem bei Mailadressen von Hochschulen und sehr großen Firmen, die ein weit verzweigtes Netzwerk und viele Subdomains mit separaten Nameservern haben). Möglicherweise sind einige Informationen gecachet, andere aber nicht unbedingt.

              2. Was passiert, wenn gerade der Nameserver nicht erreichbar ist? Dann werden alle Mails als falsch zurückgewiesen, nur weil temporär ein Problem besteht, auf dass der Kunde keinen Einfluss haben kann? Das kanns nicht sein.

              3. Was ist, wenn das DNS-System veraltete Informationen an den Server leitet bzw. die neuesten Informationen (neu angemeldete Domain) noch nicht kennt? Dann wird eine schon gültige und korrekt konfigurierte Mailadresse ebenfalls fälschlich zurückgewiesen, bzw. fälschlich doch erlaubt.

              Zumindest reicht Steffis Version nicht aus, außerdem würde ich an Ihrere Stelle lieber positiv definieren was in einer Email Adresse stehen darf, denn umgekehrt erwischt man eh nicht alle Zeichen!

              Ich würde ganz banal folgendes an einer Mailadresse prüfen:
              Sind mehr als 3 Zeichen angegeben? Ist eines davon ein "@"?

              Sind diese einfachen Bedingungen nicht erfüllt, ist keine Mailadresse angegeben worden. Ein "@" ist elementarer Bestandteil einer Mailadresse, und vorher und nachher muss für Username und Host mindestens ein Zeichen vorhanden sein.

              Man könnte die Mindestzeichenzahl noch erhöhen: Der Username kann aus einem Zeichen bestehen, aber der Domainname muss im Internet mindestens eine Top-Level-Domain haben - also ein Zeichen Domainname, ein Punkt, und mindestens 2 Zeichen TLD. Zusammen 6 Zeichen. Kürzere Internet-Mailadressen gibts nicht. Eine real existierende Domain http://www.x.org könnte beispielsweise diese EMail-Adresse definiert haben: a@x.org. Da die DeNIC nur vier zweibuchstabige Domains vergeben hat und ansonsten mindestend drei Buchstaben verlangt, wird auch in Deutschland die kürzeste EMail-Adresse mindestens 7 Zeichen lang sein. Unter http://www.ix.de ist das Webangebot von Heise (Zeitschrift iX) erreichbar. Die Redakteure haben alle Zwei-Buchstaben-Mailkürzel. Es dürfte im Bereich des möglichen liegen, dass real existierende Mailadressen in der Form xx@ix.de existieren. Ein MX-Eintrag für die Domain ix.de existiert.

              Da ich nicht weltumspannend weiß, ob irgendein Länder-NIC einbuchstabige Domains zugelassen hat (oder vielleicht irgendwann man viel Geld dafür bekommt, dass dies geschieht), ist man mit dieser Annahme auf der sicheren Seite.

              Alle weitergehenden Prüfungen schließen möglicherweise gültige EMail-Adressen aus.

              Außerdem prüft die Prüfung bisher ja nur, ob die Mailadresse theoretisch funktionieren könnte. Ob sie tatsächlich echt ist, kann nur dann geprüft werden, indem eine an die Adresse versandte Mail positiv beantwortet wird. Denn Mails können gefiltert werden, verloren gehen, statt beim Empfänger ohne Fehler-Rückmeldung beim Mailadmin/Postmaster oder beim Generalempfänger landen, und und und...

              - Sven Rautenberg

              1. Hallo Sven!

                Ich habe mich auch merh aus Interesse dafür interessiert, mir ist klar das es im Prinzip meist Quatsch ist. Wenn man sicher gehen will, muß man ne mail mit Link an die Adresse schicken, bevor es weitergeht.
                Sonst geht es nur darum Falscheingaben abzufangen(was bei mail() in PHP ja einen 500er Serverfehler hervorruft, wenn es keine "echte" Email-Adrese ist, was das genau ist habe ich noch nicht rausgefunden).

                Danke für die Antwort, war sehr informativ!

                Grüße
                andreas

          2. Hi!

            Ganz trickreich, einfach den Nameserver abzufragen, ob er einen MX-Record für die Adresse enthält.

            Wie genau geschieht das denn in der Abfrage? Was überseh ich da bzw. wo wird da ein DNS-Server abgefragt?

            checkdnsrr() heißt die Funktion. :) Ist das einzige, was in diesem Teil die Zeichen "dns" enthält - hättest du also auch selbst finden können. ;)

            Oh je! Ja, hast natürlich recht. :) Aber ich saß um die Zeit wohl irgendwie neben mir. Hab den Wald vor lauter Bäumen nicht gesehen. *hmpf*

            Gruß,
            Heinz

  3. Hoi

    ich suche das Script um eine E-Mailadresse nach seiner gültigkeit zu überprüfen. Habe das mal hier im Formu gesehen aber leider finde ich es nicht mehr !!

    http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/selfforum/selfforum-cgi/shared/CheckRFC.pm

    Ist halt in Perl ... kann man aber "übersetzen" ;)

    Ciao,

    Harry
     PS: Einmal posten langt ;)

  4. Hi,

    Habe das mal hier im Formu gesehen aber leider finde ich es nicht mehr !!

    ich habe im Forum </?m=111172&t=19806> und </?m=111192&t=19806> gesehen. Was soll das?!

    Übrigens sind alle hier genannten Beispielcodes falsch.

    Cheatah

    1. Moinsen

      Übrigens sind alle hier genannten Beispielcodes falsch.

      Ich hab auch mal irgendwo gelesen (glaub auf php.net) daß es keine Möglichkeit gibt, rauszufinden, ob eine eMail-Adresse korrekt ist. Es soll ja anscheinend nicht mal einen passenden RegExp geben um den korrekten Aufbau einer eMail-Adresse zu prüfen.

      Im Forums-Quellcode hab ich aber folgendes gefunden:
      http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/selfforum/selfforum-cgi/shared/CheckRFC.pm?rev=1.11&content-type=text%2Fvnd.viewcvs-markup

      Was ist dann das ? Da wird doch definitiv eine eMail-Adresse überprüft (ich hab den Quellcode jetzt nicht auswendig gelernt und hab keine Ahnung, ob die entsprechende Funktion überhaupt jemals aufgerufen wird (außerdem kann ich praktisch kein Perl))!

      Im Kommentar steht "define regex for nearly RFC 822 email address". Also geh ich mal davon aus, daß der Ausdruck ein paar eMail-Adressen zu viel durchlässt, die meisten aber richtig erkennt bzw. abweist. Und das ist ja zumindest schonmal ein Anfang :)

      Ciao,

      Harry

      1. Aloha!

        Ich hab auch mal irgendwo gelesen (glaub auf php.net) daß es keine Möglichkeit gibt, rauszufinden, ob eine eMail-Adresse korrekt ist. Es soll ja anscheinend nicht mal einen passenden RegExp geben um den korrekten Aufbau einer eMail-Adresse zu prüfen.

        Naja, in der RFC822 (ist die überhaupt noch aktuell?) steht schon drin, wie eine Mailadresse auszusehen hat:

        address     =  mailbox                      ; one addressee
                    /  group                        ; named list

        Das ist näher definiert (ich gehe mal den direkten Weg):

        mailbox     =  addr-spec                    ; simple address
                    /  phrase route-addr            ; name & addr-spec

        addr-spec   =  local-part "@" domain        ; global address
        Das ist, was wir alle kennen! Sehr informativ! Eine Mailadresse enthält Zeichen vor und nach dem "@".

        Aber es geht weiter:
        local-part  =  word *("." word)             ; uninterpreted
                                                    ; case-preserved
        domain      =  sub-domain *("." sub-domain)
        sub-domain  =  domain-ref / domain-literal
        domain-ref  =  atom                         ; symbolic reference
        domain-literal =  "[" *(dtext / quoted-pair) "]"
        dtext       =  <any CHAR excluding "[",     ; => may be folded
                             "]", "" & CR, & including
                             linear-white-space>
        quoted-pair =  "" CHAR                     ; may quote any char
        CHAR        =  <any ASCII character>        ; (  0-177,  0.-127.)
        atom        =  1*<any CHAR except specials, SPACE and CTLs>
        ...

        Ich breche hier mal ab - man sieht, dass das ganze Gebilde von Mailadressenkomponenten ziemlich komplex werden kann. Und dass es praktisch frei von jeglichen Annahmen ist. Ein gültiger Domainteil besteht aus einer Aneinanderreihung von Subdomains, getrennt durch Punkte. Ein Subdomainteil besteht aus "atom" oder "domain-literal", welcher eckige Klammern enthält, sowie "dtext" oder "quoted-pair". "dtext" selbst erlaubt so ziemlich alle möglichen ASCII-Zeichen, die es gibt.

        Daraus folgt: Der Domainteil kann (jedenfalls laut RFC) praktisch beliebig aussehen. Sicher ist nur, dass er Punkte enthält, und sonstige Zeichen.

        Deutlich werden soll eigentlich nur, dass es sehr sehr aufwendig ist, einen _vollständigen_ Algorithmus zu entwickeln, welcher gemäß RFC 822 gültige Mailadressen ermittelt. Alle Programme, die es gibt, werden mit an Sicherheit grenzender Wahrscheinlichkeit nur eine kleinere Untermenge an Variationen unterstützen - und damit prima funktionieren. Das bedeutet aber dummerweise für die Mailadressen, dass man kaum sagen kann, ob eine konkrete Mailadresse existiert, weil man die Möglichkeiten des Mailservers nicht kennt.

        Deswegen: Mailadressen enthalten ein "@" und im Internet-DNS gültige Domainnamen (was die verwendbaren Zeichen angeht), sowie irgendeinen Usernamen. Mehr kann man an Mailadressen kaum prüfen, ohne einen hohen Aufwand zu treiben.

        Im Forums-Quellcode hab ich aber folgendes gefunden:
        http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/selfforum/selfforum-cgi/shared/CheckRFC.pm?rev=1.11&content-type=text%2Fvnd.viewcvs-markup

        Was ist dann das ? Da wird doch definitiv eine eMail-Adresse überprüft (ich hab den Quellcode jetzt nicht auswendig gelernt und hab keine Ahnung, ob die entsprechende Funktion überhaupt jemals aufgerufen wird (außerdem kann ich praktisch kein Perl))!

        Das ist in der Tat eine ziemlich genaue Nachbildung der RFC822. Und du siehst, wieviel Aufwand das ist. Vermutlich wird auch enorm viel Performance verbraten, um Mailadressen auf diese Weise zu prüfen. Schließlich ist der Aufbau des RegEx sehr diffizil, weitverzweigt und komplex.

        Im Kommentar steht "define regex for nearly RFC 822 email address". Also geh ich mal davon aus, daß der Ausdruck ein paar eMail-Adressen zu viel durchlässt, die meisten aber richtig erkennt bzw. abweist. Und das ist ja zumindest schonmal ein Anfang :)

        Er wird mit Sicherheit zuviele Mailadressen durchlassen. Insbesondere kann man sich ja locker gültige Mailadressen ausdenken, die dennoch nicht existieren. Oder die tatsächlich existieren, einem aber nicht gehören.

        Gegen dumme Tippfehler hilft der Check auf "@". Gegen Manipulation nur Double-Opt-In (also Aktionen erst nach einer Antwort auf eine Mail zu veranlassen).

        - Sven Rautenberg

        1. Hi,

          Es soll ja anscheinend nicht mal einen passenden RegExp geben um den korrekten Aufbau einer eMail-Adresse zu prüfen.

          die Syntax ist natürlich durchaus definiert :-)

          Naja, in der RFC822 (ist die überhaupt noch aktuell?)

          Die Mail-RFCs um Nr. 822 sind jetzt alle um 2000 aktueller; aber in RFC 2822 steht meines Wissens auch nichts spektakulär neues drin ;-) zumindest was den Aufbau von Mailadresse betrifft.

          Ich breche hier mal ab - man sieht, dass das ganze Gebilde von Mailadressenkomponenten ziemlich komplex werden kann.

          Ja. Unter anderem ist

          "Ich mag #Special Ch@racters# im Localpart!"@teamone.de

          ebenfalls (IIRC) technisch korrekt... Ich wette, die meisten Scripts würden das ablehnen.

          Daraus folgt: Der Domainteil kann (jedenfalls laut RFC) praktisch beliebig aussehen. Sicher ist nur, dass er Punkte enthält, und sonstige Zeichen.

          Wenn man sich auf DNS-kompatible Hostnamen beschränken möchte, wird die Sache ein wenig einfacher. n Segmente (n>=2), die jeweils Buchstaben, Ziffern und den Bindestrich enthalten sowie maximal 127 Zeichen lang sind, durch Punkt voneinander getrennt. Wenn das letzte Segment nicht zufällig "invalid" lautet, muss[1] es eine gültige Top-Level-Domain sein; die davor notierte Subdomain muss im zugehörigen System registriert sein; der gesamte Hostname muss von einem DNS-Server korrekt beantwortet werden.

          [1] Wobei ich momentan nicht hundertprozentig sicher bin, wie es mit IP-Adressen aussieht.

          Deutlich werden soll eigentlich nur, dass es sehr sehr aufwendig ist, einen _vollständigen_ Algorithmus zu entwickeln, welcher gemäß RFC 822 gültige Mailadressen ermittelt. Alle Programme, die es gibt, werden mit an Sicherheit grenzender Wahrscheinlichkeit nur eine kleinere Untermenge an Variationen unterstützen - und damit prima funktionieren. Das bedeutet aber dummerweise für die Mailadressen, dass man kaum sagen kann, ob eine konkrete Mailadresse existiert, weil man die Möglichkeiten des Mailservers nicht kennt.

          Richtig. So sind "bla..blub@teamone.de" und "bla.@teamone.de" beispielsweise ungültig...

          Das ist in der Tat eine ziemlich genaue Nachbildung der RFC822. Und du siehst, wieviel Aufwand das ist. Vermutlich wird auch enorm viel Performance verbraten, um Mailadressen auf diese Weise zu prüfen.

          Ja - selbst wenn man auf die Prüfung der Existenz des Hostes verzichtet.

          Im Kommentar steht "define regex for nearly RFC 822 email address". Also geh ich mal davon aus, daß der Ausdruck ein paar eMail-Adressen zu viel durchlässt, die meisten aber richtig erkennt bzw. abweist.

          Ich nehme an, dass vor allem die "alten" Systeme (Mailbox usw.), die heutzutage "im Internet nichts verloren haben", als ungültig definiert. Der Rest sollte eigentlich vollkommen RFC-konform sein.

          Insbesondere kann man sich ja locker gültige Mailadressen ausdenken, die dennoch nicht existieren. Oder die tatsächlich existieren, einem aber nicht gehören.

          Oh ja. Ich habe beispielsweise ein Mail-Account, welches bevorzugt für irgendwelche Anmeldungen missbraucht wird... häufig von Leuten, die sich dazu passend "das Web" nennen. Meine Filter-Liste ist mittlerweile legendär und könnte, selbst ohne Kommentare, ein Buch füllen; wenn auch nur eines der Stärke von "kulinarische Meisterwerke der britischen Küche".

          Gegen dumme Tippfehler hilft der Check auf "@". Gegen Manipulation nur Double-Opt-In (also Aktionen erst nach einer Antwort auf eine Mail zu veranlassen).

          Ja.

          Cheatah

  5. <?php

    # überprüft via SMTP mittels VRFY-Kommando oder
          # durch einen angetäuschten EMail-Versand, ob die
          # Adresse von dem entsprechenden Mailserver
          # akzeptiert wird
          #

    function check_email($email) {
          $result = false;

    if (preg_email($email)) {

    #-- email-Adresse in $user und $domain aufsplitten
             list($user, $domain) = explode('@', $email);

    #-- die MX-Server für $domain bestimmen
             getmxrr($domain, $mx_servers);
                $mx_servers[] = $domain;
                foreach ($mx_servers as $smtp_server) {

    #-- mit SMTP-Server verbinden
                   if (! $result)
                   if ($socket = fsockopen($smtp_server, 25)) {

    #-- warten auf SMTP ready
                      socket_set_blocking($socket, false);
                      $loop = 0;
                      while (! preg_match('/^220[ ]/', fgets($socket, 2048)))
                      {  #-- Schleife, weil anfangs SMTP-Datemmüll kommen kann
                         if ($loop++ > 19999) { fclose($socket); break 2; }
                      }

    #-- Proto
                      socket_set_blocking($socket, true);
                      socket_command($socket, "HELO www.example.com\r\n");
                      if (! ($result = preg_match('/^25/',
                          socket_command($socket, "VRFY {$user}\r\n"))))
                      {
                         socket_command($socket, "MAIL FROM:trash@example.com\r\n");
                         $result = preg_match('/^25/',
                            socket_command($socket, "RCPT TO:<{$email}>\r\n"));
                      }

    #-- SMTP-Verbindung beenden
                      fputs($socket, "QUIT\r\n");
                      fclose($socket);
                   }#if($socket)
                }#foreach($mx_servers)
             ##if(getmxrr)
          }#if(preg_email)

    return($result);
       }

    if (! function_exists("socket_command")) {
       function socket_command($socket, $cmd) {
          fputs($socket, $cmd);
          $result = fgets($socket, 2048);
    //      DEBUG("$cmd$result", "SOCKETCMD_");
          return($result);
       }
       }

    # --------------------------------------------------------------------

    # überprüft die Schreibweise / den Aufbau der email-Adresse
          #

    function preg_email($string) {
          $chars = '[-_%+&#*äöüÄÖÜßa-zA-Z0-9]+';
          if (preg_match("/^({$chars}[.]*)+@+$/i", $string)) {
             return(true);
          } else echo "NPM($string)";
       }

    ?>