Validierung von eMail-Adressen (Selfforumssieb)
Schuer
- selfforumssieb
0 Jeena Paradies0 Dirk Schürjohann0 Boris0 Götz0 idubn0 Robert B.0 Sven Rautenberg
Sollte man die Prüfung von eMail-Adressen innerhalb eines Formulars aufs @ und den Punkt beschränken? Oder ist selbst der Punkt willkürlich? Auslese einer Forumsdiskussion.
Auslöser zur Diskussion war der SELFHTML-Featureartikel »Programmiertechnik: E-Mail-Kontrolle«, in dem Christian Kruse beschreibt (besser: regext), wie man eine vom Nutzer angegebene eMail-Adresse gemäß RFC819 zerpflückt.
Vinzenz Mai kommentiert:
Diese ist – wie die meisten derartigen Prüfungen – fehlerhaft.
Beispiel: Top-Level-Domain .museum ist nicht gestattet.
Siechfreds Einwurf, man könne den regulären Ausdruck innerhalb des Featureartikels dahingehend erweitern, dass er TLDs mit einer Länge von bis zu sechs Zeichen akzeptierte, wird mit einem früheren Zitat von Manuel B. kommentiert:
Und [..] was ist mit TLDs, die es noch nicht gibt? Ein Script, das bewusst zukünftige Entwicklungen begrenzt, ist IMHO eine völlige Fehlplanung.
Vinzenz spricht von der Notwendigkeit eines Webautors, abgelieferte Auftragsarbeiten dauerhaft kontrollieren zu müssen, falls derartige eMail-Prüfungen eingesetzt würden und verweist auf ein Posting MudGuards, das eine Übersicht neuer TLDs aus nicht-englischen Adresszonen enthält, die zukünftig in Gebrauch kommen könnten. Vinzenz:
Wenn diese TLDs in Betrieb gehen, darf der Benutzer solcher
TLDs erwarten, seine Mail-Adresse auch in der ihm geläufigen Schrift einzugeben – und nicht in Punycode buchstabieren zu müssen.
Selbst lesen: Die gesamte Diskussion im SELFHTML-Forum.
Vielen Dank an alle Beteiligten!
Ein erstes Fazit kam rückblickend gleich am Anfang von Vinzenz, der bestätigt, was auch schon an anderen Stellen des Selfforums diskutiert wurde:
Viele beschränken ihre Überprüfung auf das Vorhandensein von @
und einem . irgendwo dahinter.
Ein zweites, ernüchterndes Fazit zur Frage »How do I check a valid mail address?« findet sich in der Perl-FAQ:
You can't, at least, not in real time.
Man kann natürlich auch eine syntaktisch richtige aber nicht existierende Adresse angeben.
Jeena, genau, das merkt auch Alexander (HH) im Forum an:
RFC 2606 sagt, dass die Domain example.com (und ein paar andere) für Beispiele reserviert ist. Alle Mail-Adressen @example.com sind zwar technisch gültig, werden aber keinen sinnvollen Empfänger erreichen (die Domains sind auf die IANA registriert). [..] dummy@hotmail.invalid, dummy@spamschleuder.test, und dummy@morespam.example werden keine Empfänger finden.
Meines Wissens gibt es keinen einzelnen RFC, der exakt und klar und deutlich den Rahmen dessen absteckt, was als gültige E-Mailadresse zählt. Ich habe mich vor ein paar Jahren mal etwas mit der Materie befasst, weil ich eine verlässliche Prüfung per Javascript für Kontaktformulare bauen wollte. Ich kam aus dem Staunen nicht mehr heraus und habe am Ende mehr oder weniger aufgegeben. Zur Zeit verwende ich eine Prüfung, die ein paar ausgesuchte Kriterien prüft, aber weit jenseits einer vollständigen Prüfung steht. Damit kann ich halbwegs wirksam verhindern, dass Leute völligen Unfug in ein E-Mail-Adressfeld eingeben.
Ich weiß nicht, ob ich seinerzeit Wesentliches übersehen habe, aber ich konnte nicht einmal sicher ermitteln, wie lange die Teile vor und nach dem '@' maximal sein dürfen.
Und immerhin sind z.B. solche Geschichten wie die folgenden Beispiele gültige E-Mailadressen:
Hubertus von der hohen Alm <hubertus.hohe-alm@www.meinserver.de> jubeltrubelundeitleheiterkeitimfachbereich@uniserver
Ich habe damals Jeffrey Friedls berühmt-berüchtigtes Buch "Reguläre Ausdrücke" herangezogen. Er befasst sich gegen Ende mit dieser Fragestellung und kommt zu dem Schluss, dass es angesichts der Komplexität der Möglichkeiten im Grunde witzlos ist, eine wirklich exakte Syntaxprüfung erreichen zu wollen. Sein ausgetüfteltes Beispiel einer Perl-RegEx, die annähernd dem Problem gerecht wird, ist knapp 6600 Bytes lang.
Spätestens nach 100 Bytes stellte mein Fachverständnis sanft den Dienst ein ...
Hallo Schür,
vielen Dank für den Hinweis auf diese kleine Diskussion. Ich hab mich extra durch den ganzen Thread geklickt, um zu dem Ergebnis zu kommen, daß mein Link zumindest in dieser Diskussion bisher nicht genannt wurde, weswegen ich ihn nun mal einwerfe.
Meist sollte irgendeine "Grob-Prüfung" ausreichen, im Zweifel kann man ja bei wichtigeren Anwendungen "Aktivierungs-Mails" verschicken.
Wenn man trotzdem mal "wirklich" prüfen will, ob eine angegebene E-Mail-Adresse tatsächlich exisitert, ob sie dem gehört, der sie angibt läßt sich sowieso nie prüfen, dann könnte man sich PHP Email address validation with Verify probe mal genauer anschauen. Natürlich kann es auch da Probleme geben, aber es ist eine vielleicht durchaus akzeptable Möglichkeit viele Müll-Adressen zu erkennen und nicht zuzulassen.
Das soll angeblich der RFC-2822-konforme Regex sein (Zeilenumbrüche sind von mir):
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*| "(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]| \\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.) +[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\ [(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.) {3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]: (?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]| \\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
Ich weiß nicht, ob der funktioniert, ich hab ihn bloß auf dieser Seite gefunden: http://www.regular-expressions.info/email.html
Dort wird auch erläutert, dass wahrscheinlich kein Software mit allen E-Mail-Addressen umgehen kann, und man sich deswegen nicht so streng an das RFC halten sollte.
Kann es denn überhaupt einen regulären Ausdruck geben, mit dem man die syntaktische Gültigkeit einer Emailadresse überprüfen kann? Ich interpretiere (mit meinem Wissen aus der Theoretischen Informatik) den RFC so, dass die rekursive Definition gerade die Möglichkeit eines RegExp ausschließt. Oder täusche ich mich da?
Götz, dein Link zeigt ziemlich eindrucksvoll, warum eine Validierung von Mailadressen auch mit diesem verhältnismäßig großen Aufwand nicht funktionieren kann.
Das Log für die Prüfung der Adresse "blafasel@selfhtml.org" ergibt:
Checking server mail.selfhtml.org... Opening up socket to mail.selfhtml.org... Succes! mail.selfhtml.org replied: 220 odin.selfhtml.org ESMTP HELO outkast.tienhuis.nl 250 odin.selfhtml.org (10.62 ms) MAIL FROM: <postmaster@tienhuis.nl> 250 2.1.0 Ok (12.17 ms) RCPT TO: <blafasel@selfhtml.org> 450 4.7.1 <blafasel@selfhtml.org>: Recipient address rejected: Greylisted (98.93 ms) QUIT 221 2.0.0 Bye (8.40 ms) Succesful communication with mail.selfhtml.org, no hard errors, assuming OK Address appears to be valid...
Folgende Vorgehensweisen sind aus meiner Sicht denkbar:
Da man also auch mit enormem Aufwand keine hundertprozentige, und insbesondere keine synchrone Prüfung auf tatsächliche Korrektheit erlangen kann, stellt sich somit die Frage, warum man dann noch riesigen Aufwand in die Formulierung eines pseudokorrekten regulären Ausdrucks stecken soll.