RegExp für Email Validierung
Fabienne
- php
Hallo und guten Abend,
ich arbeite gerade an einer Validierung für E-Mail-Adressen, die via Formular eingegeben werden soll.
Dort möchte ich per RegExp den String wie folgt prüfen:
// Erstmal klein machen
$_GET['mail']=strtolower($_GET['mail']);
// sämtliche TLDs eintragen, die man zulassen moechte
$tld_array = array("DE","COM","NET");
// den RegExp-String zusammenbauen
$tld_string = join("|",$tld_array);
$regexp= "/[1]+[_.0-9a-z-]*@([0-9a-z]+[0-9a-z-]*.){1,7}(".$tld_string."){1}$/";
// Mail-Adresse pruefen
if(preg_match($regexp,$_GET['mail']))
{
// Jippee! Valide Mail-Adresse!
}
Wichtig sind mir folgende Punkte:
1. Es sollen nur die namentlich bekannten TLDs zugelassen sein.
2. Es sollten Mail-Adressen auch von Subdomains zugelassen sind (@de.dell.com)
3. E-Mail-Adressen dürfen aus mindestens 1 Zeichen bestehen
4. Domains dürfen aus mindestens 2 Zeichen bestehen.
5. Umlautdomains? Was meint ihr dazu?
Und es klappt einfach nicht so, wie ich mir das vorstelle....
Kennt sich damit jemand aus?
Besten Dank
Fabienne
0-9a-z ↩︎
Hi,
$_GET['mail']=strtolower($_GET['mail']);
Die komplette Email-Adresse ist jetzt also kleingeschrieben.
// sämtliche TLDs eintragen, die man zulassen moechte
$tld_array = array("DE","COM","NET");
Hier hast Du großgeschriebene TLDs.
// den RegExp-String zusammenbauen
$tld_string = join("|",$tld_array);
$regexp= "/[1]+[_.0-9a-z-]*@([0-9a-z]+[0-9a-z-]*.){1,7}(".$tld_string."){1}$/";
Die TLDs sind immer noch großgeschrieben.
if(preg_match($regexp,$_GET['mail']))
Kein i-Flag, also erfolgt die Prüfung case-sensitiv.
Die in der kleingeschriebenen Email-Adresse enthaltene (ebenfalls kleingeschriebene) TLD wird niemals die im Regex enthaltene großgeschriebene TLD matchen.
- Domains dürfen aus mindestens 2 Zeichen bestehen.
Warum willst Du diese (der Realität widersprechende) Einschränkung machen?
cu,
Andreas
0-9a-z ↩︎
Hi Andreas,
Hier hast Du großgeschriebene TLDs.
Jop. Da hast Du recht.
Kein i-Flag, also erfolgt die Prüfung case-sensitiv.
Hab ich getestet. Geht trotzdem nicht.
- Domains dürfen aus mindestens 2 Zeichen bestehen.
Warum willst Du diese (der Realität widersprechende) Einschränkung machen?
Gibt es Domains mit 1 Zeichen?
Interessant wären hier wohl Umlautdomains (und zukünftig auch die E-Mail-Aliasse mit Umlauten...).
Beste Grüße
Fabienne
Hi,
- Domains dürfen aus mindestens 2 Zeichen bestehen.
Warum willst Du diese (der Realität widersprechende) Einschränkung machen?
Gibt es Domains mit 1 Zeichen?
Natürlich.
cu,
Andreas
Hi!
- Domains dürfen aus mindestens 2 Zeichen bestehen.
Warum willst Du diese (der Realität widersprechende) Einschränkung machen?
Gibt es Domains mit 1 Zeichen?Natürlich.
Klar!
Ich dachte die Diskussion sei durch: es gibt kein RegEx, das *jede* gültige E-Mail-Adresse matcht!
Bei mir ist 'schnubbel' eine gültige Adresse, die elektronische Post empfängt.
off:PP
Hi PP,
Ich dachte die Diskussion sei durch: es gibt kein RegEx, das *jede* gültige E-Mail-Adresse matcht!
Das ist schade und war mir bis dato unbekannt.
Beste Grüße
Fabienne
Hi,
Ich dachte die Diskussion sei durch: es gibt kein RegEx, das *jede* gültige E-Mail-Adresse matcht!
Doch, gibt es.
.*
matcht jede gültige E-Mail-Adresse.
(ok, es matcht natürlich auch ungültige Adressen, aber das ist halt ein kleiner Nebeneffekt ;-))
cu,
Andreas
Hi Andreas!
Ich dachte die Diskussion sei durch: es gibt kein RegEx, das *jede* gültige E-Mail-Adresse matcht!
Doch, gibt es.
.*
matcht jede gültige E-Mail-Adresse.
Und fast jeden anderen Scheiß - ok, Punkt für Dich!
(ok, es matcht natürlich auch ungültige Adressen, aber das ist halt ein kleiner Nebeneffekt ;-))
Naja - was ist schon perfekt?
off:PP
Hi,
ich arbeite gerade an einer Validierung für E-Mail-Adressen, die via Formular eingegeben werden soll.
Dort möchte ich per RegExp den String wie folgt prüfen:
Pfui, aus!
Und es klappt einfach nicht so, wie ich mir das vorstelle....
Kein Wunder - Validierung von E-Mail-Adressen ist ein mehr als komplexes Thema. Das bestätigen dir auch etliche Threads im Archiv, bitte mal suchen.
Und anschließend beschränke dich darauf, FILTER_VALIDATE_EMAIL zu nutzen. Das ist alle Mal sinnvoller, als irgendein RegEx-Monster zu basteln - insbesondere, wenn die Kenntnisse in der Materie noch eher spärlich sind.
MfG ChrisB
@@ChrisB:
nuqneH
Und anschließend beschränke dich darauf, FILTER_VALIDATE_EMAIL zu nutzen. Das ist alle Mal sinnvoller
Aber immer noch nicht sinnvoll.
Qapla'
@@Fabienne:
nuqneH
// sämtliche TLDs eintragen, die man zulassen moechte
$tld_array = array("DE","COM","NET");
Welchen sehr speziellen Anwendungsfall willst du damit abdecken?
Qapla'
Hi Qapla,
Welchen sehr speziellen Anwendungsfall willst du damit abdecken?
Eigentlich gar keinen. Ich will nur checken, dass wenigstens eine TLD drin steht. Local aufgelöste Namen interessieren mich weniger.
Beste Grüße
Fabienne
@@Fabienne:
nuqneH
Welchen sehr speziellen Anwendungsfall willst du damit abdecken?
Eigentlich gar keinen.
Dann ist es gar nicht sinnvoll, eine Whitelist für TLDs angeben zu wollen.
Ich will nur checken, dass wenigstens eine TLD drin steht.
Du könntest prüfen, ob ein '@' und nach diesem ein '.' vorkommt. Das ist aber auch schon alles.
.+@.+..+
Qapla'
Hi Qapla,
Du könntest prüfen, ob ein '@' und nach diesem ein '.' vorkommt. Das ist aber auch schon alles.
.+@.+..+
Ja, bereits so umgesetzt.
https://forum.selfhtml.org/?t=206211&m=1399397
Beste Grüße
Fabienne
Hallo Fabiene,
Hallo und guten Abend,
// Erstmal klein machen
$_GET['mail']=strtolower($_GET['mail']);
zu deinem Problem wurde ja vieles gesagt. Nur das, was du hier machst, ist generell eher ungünstig. Du veränderst eine automatisch von PHP global verfügbare Variable (Superglobale). Angenommen, in deinem 5000-Zeilen-Skript möchte nun ein anderer Entwickler auf Zeile 4732 sehen, was der User z.B. in einem Formular abgesandt hat. Je nach Position im Quellcode sieht er nicht die ursprüngliche Eingabe, sondern deine veränderte. Ich denke, du hast dieses Konstrukt gewählt, um nicht dem Umkopieren beschuldigt zu werden?
Nicht immer ist Umkopieren falsch, auch wenn es hier leider oft pauschal so behauptet wird. Je nachdem, wieviele Operationen du auf deine Variable in diesem Fall anwenden möchtest, wäre ein Umkopieren durchaus nicht die schlechteste Lösung. Diese hier ist es.
Merke: das Manipulieren von PHPs Superglobalen ist schlechter Stil und häufig unterschätze Fehlerquelle.
viele grüße
sven
Hi!
Nicht immer ist Umkopieren falsch, auch wenn es hier leider oft pauschal so behauptet wird. Je nachdem, wieviele Operationen du auf deine Variable in diesem Fall anwenden möchtest, wäre ein Umkopieren durchaus nicht die schlechteste Lösung. Diese hier ist es.
Du übersiehst, dass es es sich im vorliegenden Fall nicht um ein Umkopieren handelt, bei dem der neue Wert weiterhin gleich dem alten bleibt, sondern um ein Ablegen eines veränderten Wertes.
$mail = $_GET['mail'];
wäre sinnloses Umkopieren, und
$mail = strtolower($_GET['mail']);
ist kein Umkopieren. Solche Fälle wird wohl kaum einer (ungestraft) als nicht sinnvolles Umkopieren bezeichnen.
Merke: das Manipulieren von PHPs Superglobalen ist schlechter Stil und häufig unterschätze Fehlerquelle.
Eine pauschale Behauptung.
Lo!
Nachtrag:
Warum möchtest du denn die email-Adresse(*) validiert haben? Beantworte dir zuerst diese Frage. Dann denke über weitere Schritte nach. Bedenke: theoretisch gibt es _sehr viele_ gültige Email-Adressen, die trotzdem keinen Besitzer haben.
*
"Newly coined nonce words of English are often spelled with a hyphen, but the hyphen disappears when the words become widely used. For example, people used to write 'non-zero' and 'soft-ware' instead of 'nonzero' and 'software'; the same trend has occurred for hundreds of other words. Thus it's high time for everybody to stop using the archaic spelling 'e-mail'. Think of how many keystrokes you will save in your lifetime if you stop now! The form 'email' has been well established in England for several years, so I am amazed to see Americans being overly conservative in this regard. (Of course, 'email' has been a familiar word in France, Germany, and the Netherlands much longer than in England --- but for an entirely different reason.)"
Donald Knuth
Hi again,
Warum möchtest du denn die email-Adresse(*) validiert haben? Beantworte dir zuerst diese Frage. Dann denke über weitere Schritte nach. Bedenke: theoretisch gibt es _sehr viele_ gültige Email-Adressen, die trotzdem keinen Besitzer haben.
Aus einem ganz einfachen Grund: ich möchte die Benutzereingaben von vornherein etwas filtern, dass nicht jeder Quatsch losgeschickt werden kann.
Dass es zahlreiche und unmögliche Möglichkeiten gibt, mag sein.
Aber immerhin habe ich das Gefühl, dass nur "sinnvolle" Anfragen bei mir ankamen. (Übrigens: alles nicht sinnvolle wird Serverseitig in ner TXT gespeichert und von Zeit zu Zeit durchgesehen und gelöscht. Bis heute keine einzige Fehlmeldung).
Da ich weder Russisch noch Chinesisch spreche, sind solche Anfragen für mich auch eher zweitrangig.
Leider sind bis dato alle Antworten eher im Stil "vergiss es" und meine eigentliche Frage nach dem RegExp nicht beantwortet.
Sobald ich "meine" Lösung gefunden habe, werde ich diese hier posten.
Beste Grüße
Fabienne
@@Fabienne:
nuqneH
Da ich weder Russisch noch Chinesisch spreche, sind solche Anfragen für mich auch eher zweitrangig.
Es gibt aber durchaus Russen und Chinesen, die deutsch sprechen. Und es gibt Deutsche, die in Russland oder China leben. Warum sollen diese Leute dir keine E-Mail auf deutsch schicken dürfen?
Leider sind bis dato alle Antworten eher im Stil "vergiss es"
Wieso leider? Genau das ist die richtige Antwort.
Qapla'
Hi Qapla,
Es gibt aber durchaus Russen und Chinesen, die deutsch sprechen. Und es gibt Deutsche, die in Russland oder China leben. Warum sollen diese Leute dir keine E-Mail auf deutsch schicken dürfen?
Doch, dürfen die gerne. Aber mit einer kyrillischen Schreibweise einer TLD oder Domains bin ich nicht ganz vertraut.....
Aber ich habe meine Meinung dahingehend schon geändert, dass ich so ziemlich alles zulassen werde, was da kommt.
Wieso leider? Genau das ist die richtige Antwort.
Jop. Hab ich inzwischen eingesehen.
Beste Grüße
Fabienne
@@Fabienne:
nuqneH
Hi Qapla,
??
Es gibt aber durchaus Russen und Chinesen, die deutsch sprechen. Und es gibt Deutsche, die in Russland oder China leben. Warum sollen diese Leute dir keine E-Mail auf deutsch schicken dürfen?
Doch, dürfen die gerne. Aber mit einer kyrillischen Schreibweise einer TLD oder Domains bin ich nicht ganz vertraut.....
In diesem Fall dachte ich erstmal an 'ru' und 'cn', die in deiner Whitelist fehlten, noch gar nicht mal an 'рф' und '中国'/'中國'.
Aber ich habe meine Meinung dahingehend schon geändert, dass ich so ziemlich alles zulassen werde, was da kommt.
Vernünftige Entscheidung.
Qapla'
@@sven klaus:
nuqneH
email-Adresse(*) […]
* "Newly coined nonce words of English are often spelled with a hyphen, but the hyphen disappears when the words become widely used. […]"
Donald Knuth
Die Schreibweise im Englischen ist irrelevant. Im Deutschen in allein "E-Mail" richtig. [http://www.duden.de/sprachratgeber/schreibung-von-e-mail]
"E-Mail-Adressen" war völlig richtig. "Email Validierung" hingegen gleich ein Doppelfehler. 0:15.
Qapla'
Im Deutschen in allein "E-Mail" richtig. [http://www.duden.de/sprachratgeber/schreibung-von-e-mail]
In welchem Land ist der Duden doch gleich nochmal das bindende Regelwerk für die Sprache?
"E-Mail-Adressen" war völlig richtig.
Ja, aber nicht weil is im Duden steht, sondern umgekehrt: im Duden steht es, weil es richtig ist :p
Der Duden erfasst die korrekte (vorhandene) Rechschreibung, er definiert sie aber nicht. Das ist ein verbreitetes Missverständnis.
Hallo
email-Adresse(*) […]
* "Newly coined nonce words of English are often spelled with a hyphen, but the hyphen disappears when the words become widely used. […]"
Donald KnuthDie Schreibweise im Englischen ist irrelevant. Im Deutschen in allein "E-Mail" richtig. [http://www.duden.de/sprachratgeber/schreibung-von-e-mail]
*lach*
Hallo nochmals,
hier mal eine Diskussionsgrundlage:
$regexp= "/^[0-9a-zäüöÄÜÖ]+[_\.0-9a-z\-äüöÄÜÖ]*\@([0-9a-zäüöÄÜÖ]+[0-9a-z\-_äüöÄÜÖ]*\.){1,5}(de|com|net|org){1}$/i";
1. Darf nicht mit -, _ oder Punkt beginnen
2. ein @
3. Domain darf nicht mit - oder _ beginnen, sonst schon.
4. 1 bis 5 "Domains / Subdomains" sind zugelassen
5. Am Schluss muss eine der angegebenen Endungen vorhanden sein.
Seht Ihr da noch Fehler oder habe ich was vergessen?
Schließe ich jemanden unbewusst aus, den ich eigentlich nicht ausschließen wollte?
Ich will damit nur den groben Schmutz abfischen und nicht eine valide, existierende E-Mail-Adresse sicherstellen.
Beste Dank für Eure Hinweise!
Fabienne
Moin!
$regexp= "/[1]+[_.0-9a-z-äüöÄÜÖ]@([0-9a-zäüöÄÜÖ]+[0-9a-z-_äüöÄÜÖ].){1,5}(de|com|net|org){1}$/i";
>
> 1. Darf nicht mit -, \_ oder Punkt beginnen
> 2. ein @
> 3. Domain darf nicht mit - oder \_ beginnen, sonst schon.
> 4. 1 bis 5 "Domains / Subdomains" sind zugelassen
> 5. Am Schluss muss eine der angegebenen Endungen vorhanden sein.
>
> Seht Ihr da noch Fehler oder habe ich was vergessen?
> Schließe ich jemanden unbewusst aus, den ich eigentlich nicht ausschließen wollte?
>
> Ich will damit nur den groben Schmutz abfischen und nicht eine valide, existierende E-Mail-Adresse sicherstellen.
Was ist "grober Schmutz" für dich?
Mit diesem Regex schließt du massenhaft gültige Mailadressen aus, weil es logischerweise viel mehr Top-Level-Domains gibt, als du annimmst.
Auf der anderen Seite lässt du z.B. ungültige Domainangaben durch. Der Regex ist also weder zum Filtern geeignet, noch zur Validierung.
Die Sache ist eigentlich relativ simpel:
"Gültig" und zur weiteren Verwendung freigegeben ist eine Mailadresse erst dann, wenn man an diese Adresse einen Validierungslink gesendet hat, und der vom Mailempfänger aktiv geklickt wurde. Solange das nicht der Fall ist, ist die Mailadresse invalide und nicht benutzbar.
Um zu verhindern, dass User mit allzu blöden Tippfehlern eine von vornherein nicht funktionierende Mailadresse eingeben, kann man als Check der Eingabe ein einfaches Muster anwenden: Irgendwelche Zeichen, dann ein "@", dann irgendwelche Zeichen, ein "." und wieder irgendwelche Zeichen.
Als Regex: .+@.+\..+
Ohne "@" ist die Adresse keine im Internet nutzbare Adresse, und ohne mindestens einem Punkt hinter dem "@" ebenfalls nicht.
- Sven Rautenberg
0-9a-zäüöÄÜÖ ↩︎
[latex]Mae govannen![/latex]
Um zu verhindern, dass User mit allzu blöden Tippfehlern eine von vornherein nicht funktionierende Mailadresse eingeben, kann man als Check der Eingabe ein einfaches Muster anwenden: Irgendwelche Zeichen, dann ein "@", dann irgendwelche Zeichen, ein "." und wieder irgendwelche Zeichen.
Als Regex: .+@.+..+
Ohne "@" ist die Adresse keine im Internet nutzbare Adresse, und ohne mindestens einem Punkt hinter dem "@" ebenfalls nicht.
„KISS“ ist bei Mail-Adressen immer eine gute Idee.
Vielleicht sollte man noch hinzunehmen, daß _genau ein_ „@“ und _kein_ Komma vorkommt[1]. Dazu muß dann allerdings nicht die RegEx aufgebläht werden, sondern bspw. (mb_)substr_count verwendet werden.
Stur lächeln und winken, Männer!
Kai
[1] um zu verhindern, daß ggf. automatische Antworten an mehrere Mail-Adressen gesendet werden -> Spam-Schleuder
Hallo nochmals,
Als Regex: .+@.+..+
OK, ihr habt mich überzeugt, dass mein Ansatz nicht zielführend ist.
$regexp= "/^.+@.+\..+$/i";
if((preg_match($regexp,$email) && substr_count($email,",")==0 && substr_count($email,"@")==1)
|| filter_var($email, FILTER_VALIDATE_EMAIL))
{
//Gute Mail-Adresse
}
Damit wird eine syntaktisch richtige Mail-Adresse als gut befunden (also mind. genau ein @, keine Kommata und mind. ein Punkt hinter dem @).
Besten Dank für Eure Unterstützung
Fabienne
OK, ihr habt mich überzeugt, dass mein Ansatz nicht zielführend ist.
Der folgende aber auch nicht.
$regexp= "/^.+@.+..+$/i";
if((preg_match($regexp,$email) && substr_count($email,",")==0 && substr_count($email,"@")==1)
|| filter_var($email, FILTER_VALIDATE_EMAIL))
{
//Gute Mail-Adresse
}
>
> Damit wird eine syntaktisch richtige Mail-Adresse als gut befunden (also mind. genau ein @, keine Kommata und mind. ein Punkt hinter dem @).
Das ist aber unsinn - damit lässt du auch wieder Lokale Mailadressen durch, da diese von filter\_var() als gültig befunden werden. foo@example
nochmal substr\_count auf das @ ist ebenfalls Unfug - das wird sowieso durch den Ausdrucks chon abgedeckt.
Der /i-Modifikator ist in dem Audruck afaik auch unsinn - was soll da case-sensitive sein? Das @ oder ein Punkt?
Mahlzeit suit,
$regexp= "/^.+@.+..+$/i";
nochmal substr_count auf das @ ist ebenfalls Unfug - das wird sowieso durch den Ausdrucks chon abgedeckt.
Das ist nicht korrekt. substr_count() prüft in dem Fall, ob *genau ein* @ vorkommt. Das Muster würde mehrere davon zulassen.
MfG,
EKKi
Das ist nicht korrekt. substr_count() prüft in dem Fall, ob *genau ein* @ vorkommt. Das Muster würde mehrere davon zulassen.
Du hast natürlich recht.
@@EKKi:
nuqneH
Das Muster würde mehrere davon zulassen.
Was ja auch korrekt ist. 'foo@bar'@example.net ist eine valide E-Mail-Adresse, IIRC.
Qapla'
Was ja auch korrekt ist. 'foo@bar'@example.net ist eine valide E-Mail-Adresse, IIRC.
Womit du auch wieder recht hast :)
Aber foo@bar@example.net nicht - und genau diese syntaktische Sache prüft der Ausdruckt nicht.
Hallo Sven,
Was ist "grober Schmutz" für dich?
Wenn sich jemand vertippt und dort ne URL eingibt....
Wie oft erlebe ich die Antwort auf "wie lautet Deine E-Mail-Adresse?": www.xyz.de
Mit diesem Regex schließt du massenhaft gültige Mailadressen aus, weil es logischerweise viel mehr Top-Level-Domains gibt, als du annimmst.
Naja, eine Liste aller TLDs läßt sich mit mehr oder weniger Aufwand zusammenstellen. Diese hier sollen nur exemplarisch sein.
Auf der anderen Seite lässt du z.B. ungültige Domainangaben durch. Der Regex ist also weder zum Filtern geeignet, noch zur Validierung.
Was müsste ich denn noch ausschließen?
"Gültig" und zur weiteren Verwendung freigegeben ist eine Mailadresse erst dann, wenn man an diese Adresse einen Validierungslink gesendet hat, und der vom Mailempfänger aktiv geklickt wurde. Solange das nicht der Fall ist, ist die Mailadresse invalide und nicht benutzbar.
Das ist wohl zu umständlich für die Filterung des "groben Schmutz". Es soll ja kein Newsletter-Login werden, sondern ein einfaches Kontakt-E-Mail-Formular.
Als Regex: .+@.+..+
Ei der Daus. Das klingt logisch und sinnnvoll. Allerdings läßt das wiederum alles durch, was ich eben etwas einschränken möchte.
Zumindest die TLDs wären doch eine sinnvolle Erweiterung. Zulässige Zeichnen für Domains könnte man auch noch mit einbauen. Oder?
Und damit bin ich schon wieder sehr nahe an meiner Lösung oben.
Beste Grüße
Fabienne
[latex]Mae govannen![/latex]
Das ist wohl zu umständlich für die Filterung des "groben Schmutz". Es soll ja kein Newsletter-Login werden, sondern ein einfaches Kontakt-E-Mail-Formular.
Gerade dann sollte die Prüfung so lax wie möglich sein. Warum jemanden ausschließen, der dir bspw. eine grobe Sicherheitslücke melden will?
Zumindest die TLDs wären doch eine sinnvolle Erweiterung. Zulässige Zeichnen für Domains könnte man auch noch mit einbauen. Oder?
Explizite Angabe der TLDs setzt voraus, daß du ständig bei ICANN/IANA verfolgst, welche Domains es gibt und diese in deinem Script auch immer aktuell hältst. Ansonsten schließt du ggf. unsinnigerweise einen gewünschten Kontakt aus, nur weil du eine TLD nicht erfasst/vergessen hast. Außerdem schränkt das ohnehin nicht viel ein. Spammer sind i.d.R. heutzutage ohnehin intelligent genug, gültige TLD zu verwenden. Ob da nun ein mal im Jahr eine Mail mit TLD statt .cthulhu statt .hk oder .de reinkommt...
Stur lächeln und winken, Männer!
Kai
Moin!
Was ist "grober Schmutz" für dich?
Wenn sich jemand vertippt und dort ne URL eingibt....
Wie oft erlebe ich die Antwort auf "wie lautet Deine E-Mail-Adresse?": www.xyz.de
Email-Adressen enthalten ein "@" und danach irgendwo einen "." - das macht mein Regex, Mission erfüllt, Doofheitsfehler eliminiert.
Mit diesem Regex schließt du massenhaft gültige Mailadressen aus, weil es logischerweise viel mehr Top-Level-Domains gibt, als du annimmst.
Naja, eine Liste aller TLDs läßt sich mit mehr oder weniger Aufwand zusammenstellen. Diese hier sollen nur exemplarisch sein.
Die Liste der TLDs verändert sich aber regelmäßig, und ist obendrein schon jetzt ziemlich lang.
Außerdem habe ich noch nie erlebt, dass User sich bei der TLD vertippen - wohl aber bei der Second-Level-Domain.
Auf der anderen Seite lässt du z.B. ungültige Domainangaben durch. Der Regex ist also weder zum Filtern geeignet, noch zur Validierung.
Was müsste ich denn noch ausschließen?
Wenn du das nicht selbst herausfinden kannst, solltest du keine derartig strenge Filterung mit Regex programmieren. Lies die einschlägigen RFC zur Bildung von Mailadressen und Domainnamen. Denn das musst du, wenn dein Argument lautet, dass nur eine strenge Validierung gegen Tippfehler schützt.
"Gültig" und zur weiteren Verwendung freigegeben ist eine Mailadresse erst dann, wenn man an diese Adresse einen Validierungslink gesendet hat, und der vom Mailempfänger aktiv geklickt wurde. Solange das nicht der Fall ist, ist die Mailadresse invalide und nicht benutzbar.
Das ist wohl zu umständlich für die Filterung des "groben Schmutz". Es soll ja kein Newsletter-Login werden, sondern ein einfaches Kontakt-E-Mail-Formular.
Die Mailadressenangabe in einem Kontaktformular braucht keine Validierung. Bestenfalls einen Check, dass da sowas wie eine Mailadresse eingegeben wurde, also mit @ drin. Wenn das fehlt, ist es definitiv keine Mailadresse.
Alles andere hingegen bringt dir nichts. Spammer erfinden keine ungültige Domains und haben auch kein Problem, gültige Mailadressen anzugeben. Und selbst legitime User kriegen es perfekt hin, valide, aber dennoch unerreichbare Mailadressen einzutippen, weil der Fehler für dich unerkennbar irgendwo in der Domain bzw. der Postfachangabe steckt.
Als Regex: .+@.+..+
Ei der Daus. Das klingt logisch und sinnnvoll. Allerdings läßt das wiederum alles durch, was ich eben etwas einschränken möchte.
Zumindest die TLDs wären doch eine sinnvolle Erweiterung. Zulässige Zeichnen für Domains könnte man auch noch mit einbauen. Oder?
Und damit bin ich schon wieder sehr nahe an meiner Lösung oben.
Dieser Regex stellt grundlegende Anforderungen an die Mailangabe, die unabdingbar sind und die sich durch technische Veränderungen von RFCs mit sehr großer Wahrscheinlichkeit nicht ändern werden.
Dadurch ist dieser Regex vermutlich die nächsten zwanzig Jahre ohne Update-Notwendigkeit zur oberflächlichen Prüfung von Mailadressen einsetzbar.
Deine Lösung mit expliziter Angabe von TLDs hingegen muss regelmäßig, im Prinzip jeden Tag, aktualisiert werden, weil grundsätzlich jederzeit weitere TLDs definiert werden können. Und wie die Vergangenheit gezeigt hat, geschieht dies häufiger, als man glaubt, und auch mit Formaten, die man nicht vorhergesehen hat. Der Klassiker bei der TLD-Prüfung ist ja [a-z]{2,3} - hat toll funktioniert, bis man .info als TLD einführte. Das Update auf [a-z]{2,4} hat toll funktioniert, bis .museum eingeführt wurde. Und es "funktioniert" ja auch weiterhin toll, weil .museum nun wirklich nicht zu den alltäglichen Domains gehört.
Aber die Pläne der zuständigen Verwaltungsgremien gehen dahin, nicht nur ASCII-Domains zu erlauben, sondern auch Unicode-TLDs einzuführen. Womit deine Validierung direkt das nächste Problem kriegt: Im Prinzip müsstest du den Domain-Part vor deinem Check mit dem Regex erstmal in Punycode konvertieren, denn deine ganzen codierten Annahmen gehen davon aus, dass nur die im DNS-System erlaubten Zeichen eingegeben werden. Umlautdomains sind bei dir derzeit nicht möglich - was bei Mails derzeit aber auch noch kein so großes Problem ist, weil Mailclients Punycode auch noch nicht flächendeckend implementiert haben. Aber das wird sich ändern.
Dasselbe Problem mit Unicode-Zeichen im Mailbox-Part wird sich über kurz oder lang auch noch entwickeln. Hierzu gibt es noch kein fertiges RFC, das wird aber mit Sicherheit kommen.
Wenn du jetzt also mit deinem Regex extrem streng bist, unter Umständen sogar hartcodiert gültige TLDs einfügst, dann hast du dir damit die Verpflichtung auferlegt, deinen Code regelmäßig an die Fortschritte der Technik anzupassen. Kannst du das leisten? Willst du das leisten? Und kannst du garantieren, dass du auf alle Stellen, an denen dein Regex verwendet wird, im Updatefall noch Zugriff hast (sprich: irgendwelche Alt-Projekte, z.B. für Kunden - da ist irgendwann der Serverzugriff weg)?
- Sven Rautenberg
Hi,
Aber die Pläne der zuständigen Verwaltungsgremien gehen dahin, nicht nur ASCII-Domains zu erlauben, sondern auch Unicode-TLDs einzuführen.
Du bist nicht up-to-date.
http://www.iana.org/domains/root/db/, dort dann oben im grauen Balken auf IDN klicken und staunen.
Es gibt bereits neben diversen test-Domains viele Domains für Länder mit Ländernamen, die sich nicht mit ASCII darstellen lassen.
cu,
Andreas
Mahlzeit Fabienne,
Wie oft erlebe ich die Antwort auf "wie lautet Deine E-Mail-Adresse?": www.xyz.de
MfG,
EKKi
Hi!
"Gültig" und zur weiteren Verwendung freigegeben ist eine Mailadresse erst dann, wenn man an diese Adresse einen Validierungslink gesendet hat, und der vom Mailempfänger aktiv geklickt wurde. Solange das nicht der Fall ist, ist die Mailadresse invalide und nicht benutzbar.
Leider reicht das in vielen Fällen nicht mehr aus, besonders wenn man sehr verbreitete Software verwendet. Unerwünschte Anmelder schaffen es auch, sich gültige Adressen zu besorgen, die Bestätigungsmail zu interpretieren und die Aktivierung vorzunehmen. Hier hilft unter Umständen eine Überwachung von 404er Zugriffen auf Abrufversuche nicht vorhandener Dinge, zum Beispiel ein Forum, das man nicht aktiviert hat.
Lo!
Moin!
"Gültig" und zur weiteren Verwendung freigegeben ist eine Mailadresse erst dann, wenn man an diese Adresse einen Validierungslink gesendet hat, und der vom Mailempfänger aktiv geklickt wurde. Solange das nicht der Fall ist, ist die Mailadresse invalide und nicht benutzbar.
Leider reicht das in vielen Fällen nicht mehr aus, besonders wenn man sehr verbreitete Software verwendet. Unerwünschte Anmelder schaffen es auch, sich gültige Adressen zu besorgen, die Bestätigungsmail zu interpretieren und die Aktivierung vorzunehmen. Hier hilft unter Umständen eine Überwachung von 404er Zugriffen auf Abrufversuche nicht vorhandener Dinge, zum Beispiel ein Forum, das man nicht aktiviert hat.
Das eine hat mit dem anderen erstmal nichts zu tun: Die Benutzung der Mailadresse für das Versenden diverser Infos hat mit dem Aktivitätsstatus eines EVENTUELL damit verbundenen User-Accounts nichts zu tun.
Die Mail mit dem Aktivierungslink aktiviert den Mailversand. Denn bei positiver Rückmeldung ist geklärt, dass a) die Mailadresse stimmt und b) der Besitzer des Postfaches die Mailadresse zur Benutzung freigibt.
Das gilt natürlich auch für unerwünschte Anwender, die diesen Vorgang automatisiert ablaufen lassen, um ihre Mailadressen massenweise automatisch zu bestätigen.
Man darf halt die Mailaktivierung nicht als Bestätigung dafür sehen, dass sich dahinter ein Mensch versteckt, und dieser auch gute Absichten hat.
- Sven Rautenberg
"Gültig" und zur weiteren Verwendung freigegeben ist eine Mailadresse erst dann, wenn man an diese Adresse einen Validierungslink gesendet hat, und der vom Mailempfänger aktiv geklickt wurde.
Dabei vergisst du "Wegwerfadressen" - die sind zwar für den Seitenbereiber wertlos bzw. unerwünscht, aber wenigstens kommt dor was an. Aber das ist ein Sonderfall.