Sven Rautenberg: E-Mailadresse überprüfen ob gültig !!

Beitrag lesen

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