# E-Mail validieren



## rosmi (19. Juni 2004)

Gibt es eine GÜLTIGE E-Mail-Adresse, die an diesem regulären Ausdruck scheitert?

(^[\\w\\.\\-]{1,})@([\\w\\.\\-]{3,})(\\.)([a-zA-Z]{2,}$)



Falls jemand dies testen möchte, hier der folständige Quellcode:

	public static boolean isValidMail(String mail) {
		String p = "(^[\\w\\.\\-]{1,})@([\\w\\.\\-]{3,})(\\.)([a-zA-Z]{2,}$)";
		Pattern pattern = Pattern.compile(p);
		Matcher matcher = pattern.matcher(mail);
		return matcher.matches();		
	}

Grüße,

Roman


----------



## Cybernd (19. Juni 2004)

> Gibt es eine GÜLTIGE E-Mail-Adresse, die an diesem regulären Ausdruck scheitert?



Garantiert. 
Ein Beispiel: Es gibt auch Domains die kürzer sind als 3 Buchstaben. Mag ja sein das hier in Deutschland mind. 3 Buchstaben vorhanden sein müssen, aber andere Registrare behandeln dies anders. (ab.org als Beispiel)

Ansonsten: Eine wirklich alle Sonderfälle abdeckende Regex braucht gleich mal eine Seite. Also frag einfach nicht solche Fragen, denn sie wird dir sowieso keiner so wirklich Beantworten können.

Ich selbst verwende die hier, da sie meiner Meinung nach die meisten relevanten Fälle abdeckt:

^([a-zA-Z0-9])+([\\.a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+(\\.[a-zA-Z0-9_-]+)+

Ist auf jedem Falle mal Korrekter als deine, da ja der Strich nicht gleich am Beginn auftauchen darf. Dafür würde ich jetzt meiner mal vorwerfen das ich die Zeichensätze mit a-zA-Z nicht umbedingt korrekt einschränke.  (Es werden ja ab jetzt die Umlautdomains aktuell .. )

Dennoch wurde hier diese Variante gewählt da ja dein /w auch einen Unterstrich beinhaltet der glaube ich nicht zu Beginn stehen darf (Bin mir selbst hier nicht mehr sicher .. )

Zudem hast du z.b. keine Subdomains abgedeckt denn das hier wäre ja auch gültig:

heinz@http://www.blub.cybernd.at

Was mich wiederum darauf bringt das deine Regex eigentlich bei genauer Betrachtung für Ihren Zweck irrelevante Bestandteile enthält:

"})@([\\w\\.\\-]{3,})(\"
wäre eigentlich ein
})@[\\w\\.\\-]{3,}(\

Denn die Klammer hat keinerlei Syntaktische Bedeutung. Sie wäre nur notwendig wenn du später diesen Part extrahieren möchtest.

Je länger ich darüber schreibe umso mehr Fehler finde ich in der eigenen Regex ;P So oder so, bisher bin ich mit meiner ganz gut gefahren. Jetzt im neuen Projekt werde ich aber sicher irgendwann einmal eine neue Pattern ausarbeiten die etwas präzise arbeitet. 

Für derartige Experimente rate ich im übrigen jedem zu folgendem Projekt:
http://brosinski.com/stephan/eclipse/

So oder so: eine präzise Prüfung benötigtst du nicht, da sie sowieso für die Katze ist. Du brauchst lediglich eine kleine Daumen x Pi prüfung um sinnlos reingetipptes Zeugs zu validieren. Dann klopft der User etwas rein das wie eine Emailadresse aussieht.

Hast du dieses Emailähnliche Konstrukt wirst du sowieso am besten eine Mail an den User schicken, denn erst nach erhalt des Validierungsschlüsselwortes ind er Email wirst du mit Sicherheit wissen was Sache ist.

Hmmm bin ich blind oder was? Ich hab die Regex in meiner Utility Klasse, benutze sie aber in keiner Funktion?

Lach ich merke gerade das dies alles vergebene Mühe ist. Wieso erstellst du nicht einfach ein Objekt der Klasse InternetAddress aus dem JavaMail Package. (JavaMail mußt du dir gesondert von Sun besorgen. Eine kleine Jar zum einbinden).

Diese Klasse wird dir dann auch gleich deine Validierung vornehmen und läßt sich zudem viel besser in der MailAPi verwenden ;o)

hth
cybi

edit: p.s chris: du wußtest ganz genau das ich mir meine Beiträge nicht verkneifen kann *grrrr*


----------



## rosmi (19. Juni 2004)

Danke für den Tip!

Seit JavaMail gibt es javax.mail.internet.InternetAddress(String address, boolean strict) - Parse the given string and create an InternetAddress, was die Sache mit E-Mail Validierung erleichtert.


----------

