Sven Rautenberg: email auf gültigkeit testen

Beitrag lesen

Moin!

ich möchte die email-eingabe mit folgender funktion testen:

Mit diesem regulären Ausdruck testest du sicherlich alles mögliche, nur leider nicht die Gültigkeit einer EMail-Adresse.

Es ist leider immer noch so: Ob eine Mailadresse existiert oder nicht kann man nur wissen, wenn man eine Mail dorthin geschickt hat und eine positive Antwort des Empfängers zurückkam. Bei Newsletteranmeldung sollte man aus diesem Grunde das Double-Opt-In-Verfahren anwenden: Mail an die angegebene Adresse schicken, in der ein Link drinsteht, der besucht werden muß - erst dann kann die Mailadresse als gültig und ernstgemeint übernommen werden.

Wenn es aber ohnehin anhand der reinen Adresse keinen Weg gibt festzustellen, ob diese Mailadresse existiert oder nicht, dann kann man sich im Prinzip komplexe Prüfungen sparen, weil sie ohnehin meist echt gültige Mailadressen ausschließen!

Konkret auf deine Funktion bezogen: Es gibt mehr als nur Usernamen der Form XXX.YYY@... Beispielsweise kann man auch sowas als Usernamen benutzen:
"Klaus Mustermann"@...
irgendwer.@... (der Punkt an letzter Stelle wurde mal von T-Online erlaubt)

Die Usernamen einzuschränken ist eine ganz schlechte Idee. Deshalb ist der einzige wirklich sinnvolle reguläre Ausdruch für den Usernamen: (.*)@

Dann gehts weiter mit den Domains. Hier sind die Regeln etwas strenger: Nur Buchstaben, Zahlen und das Minuszeichen für beliebige Subdomains, getrennt durch einen Punkt. Die Top-Level-Domain besteht dann nur aus Buchstaben. Aber wievielen? Mindestens 2. Aber 4 Buchstaben als Maximum sind falsch! Es gibt beispielsweise die TLD ".museum", welche 6 Zeichen hat. Die ist zwar nur für Museen gedacht, aber auch Museen dürfen mailen.

Und da ICANN in Zukunft sicher noch die eine oder andere weitere TLD genehmigen dürfte, ist es absolut blödsinnig, hier eine zeichenmäßige Begrenzung einführen zu wollen.

Summa summarum besteht eine EMail eigentlich nur aus dem folgenden regulären Ausdruck:

.*@[a-zA-Z0-9-.]+.[a-zA-Z]{2,}

Dieser Ausdruck kriegt einigermaßen genau total abwegige Angaben gefiltert.

Alternativ kannst du gerne die entsprechende RFC angucken und einen (es steht hier im Archiv drin) zweiseitigen regulären Ausdruck zusammenbasteln bzw. kopieren, der für wirklich alle möglichen Mailadressen, die erlaubt sind, korrekte Ergebnisse produziert. Ich halte das aber für Overkill, da die syntaktische Korrektheit einer Mailadresse nur die halbe Wahrheit ist:

Erstens kann sie immer noch ausgedacht sein.
Zweitens könnten auch syntaktisch laut RFC falsche Mailadressen tatsächlich existieren - solange die Mailserver es irgendwie hinkriegen, die Mail an den Empfängermailserver weiterzuleiten, und der den Usernamen erkennt, funktioniert das sogar.
Drittens hilft es auch nicht, wenn die Mailadresse existiert (d.h. ohne Unzustellbarkeitsvermerk zurückkommt) - sie muss auch benutzt und gelesen werden und nicht in /dev/null verschwinden.

Alle diese Überlegungen reduzieren die in meinen Augen sinnvolle Mailprüfung auf diese Punkte (vgl. regulärer Ausdruck):
1. Ist ein @ enthalten?
2. Steht davor mindestens 1 Zeichen?
3. Steht danach mindestens 1 Zeichen?
4. Kommt danach irgendwann ein Punkt?
5. Ist die Top-Level-Domain ganz am Ende?
6. Eine Mailadresse mit diesen Anforderungen ist mindestens 6 Zeichen lang: x@x.de (ja, es gibt einbuchstabige Second-Level-Domains: http://www.x.org.)

Dein konkretes Problem mit PHP liegt daran, dass du in der preg_match-Funktion die Begrenzungszeichen für den regulären Ausdruck vergessen hast. Siehe auch http://www.php.net/preg_match, erstes Beispiel.

- Sven Rautenberg