# Mail Adressen Syntax prüfen



## StefanG (26. Apr 2011)

Hallo,

ich würde gerne eine Liste mit ca. 8000 E-Mail Adressen auf einen korrekten Syntax prüfen.


```
Pattern p = 
Pattern.compile("[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-Za-z0-9!#$%&'*+/=?^_`{|
}~-]+)*@(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\.)+[A-Za-z0-9](?:[A-Za-z0-9-]
*[A-Za-z0-9])?");
```

Wie muss ich den Inhalt der Schablone richtig schreiben, damit ich keine Fehlermeldung "Ungültige Escapezeichenfolge" bekomme?

vgl. How to Find or Validate an Email Address
vgl. http://www.java-forum.org/allgemeine-java-themen/91344-string-e-mail-ueberpruefen.html


----------



## maki (26. Apr 2011)

ein [c]\[/c] muss als [c]\\[/c] geschrieben werden.


----------



## StefanG (26. Apr 2011)

Ich dachte ich müsste die ganzen Sonderzeichen ändern, alles klar. Vielen Dank!


----------



## StefanG (26. Apr 2011)

Wie muss ich die Schablone anpassen, damit Leerzeichen auch als Fehler erkannt werden?

Bsp: max.mu stermann@musterdomain.de


----------



## Sym (26. Apr 2011)

Comparing E-mail Address Validating Regular Expressions

Das ist immer recht aktuell.


----------



## Verjigorm (26. Apr 2011)

StefanG hat gesagt.:


> Wie muss ich die Schablone anpassen, damit Leerzeichen auch als Fehler erkannt werden?
> 
> Bsp: max.mu stermann@musterdomain.de



Bevor ich irgendwelche Regex auf sowas loslasse, versuche ich bestimmte Dinge mit (hoffentlich) einfacheren/schnelleren Methoden zu begegnen.
In diesem Fall eine einfache String-Operation:



> "max.mu stermann@musterdomain.de".contains(" ");



eventuellen trim()s oder sonstigen Dingen


----------



## TheDarkRose (26. Apr 2011)

wie wärs mit InternetAddress.parse()


----------



## Sym (26. Apr 2011)

Verjigorm hat gesagt.:


> Bevor ich irgendwelche Regex auf sowas loslasse, versuche ich bestimmte Dinge mit (hoffentlich) einfacheren/schnelleren Methoden zu begegnen.
> In diesem Fall eine einfache String-Operation:
> 
> 
> ...


Das ist aber wesentlich langsamer als ein Regex.


----------



## StefanG (27. Apr 2011)

Danke erstmal für die Ratschläge.

Im Moment wird "mustermann@aol. com" als ungültig erkannt, nur halt "must ermann@aol.com" nicht.

Übersehe ich in der Schablone irgendetwas? Wenn es für die Domain funktioniert müsste man es doch auch für den Namen hinkriegen.


----------



## VfL_Freak (27. Apr 2011)

Moin,

also ich prüfe E-Mailadressen hiermit auf Gültigkeit :

```
/**
 * Überprüft, ob ein möglicher String eine eMail-Adresse sein könnte
 * @param strMailAdress der Text mit der möglichen eMail-Adresse
 * @return true - > eMail-Adresse gefunden
 */
public static boolean validateMailAddress( String strMailAdress )
{
    boolean bResult = false;
    if (strMailAdress == null)
    {
        return bResult;
    }

    // Domain von {2,4} auf {1,3} geändert!! 
    // NUR diese Einstellung ermöglicht die Eingabe einer 2- bis 4-stelligen Domain (bisher 3-5!!)
    Pattern p = Pattern.compile( "^([_a-zA-Z0-9-]+)(.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+)(.[a-zA-Z0-9-]+)*(.[a-zA-Z]{1,3})[ ]*[a-zA-Z .,:;]*$" );
    Matcher m = p.matcher( strMailAdress );
    if ( !m.find() )
    {
        bResult = false;
    } 
    else
    {
        bResult = true;
    }
    return bResult;
}
```

Vielleicht hilft Dir das ja weiter ... 

Gruß
Klaus


----------



## StefanG (27. Apr 2011)

So wie ich deine Schablone interpretiere, prüfst du allerdings nicht so ausführlich auf Sonderzeichen, wie ich in meiner Schablone. Oder liege ich da falsch?

Bei meinen Daten weis ich, das es sich immer um E-Mail Adressen handelt, jedoch habe ich mit vielen falschen Eingaben zu tun. Sprich Sonderzeichen, Leerzeichen, Doppelte Mail Adressen, fehlende oder fehlerhafte Domain Angaben,....


----------



## VfL_Freak (27. Apr 2011)

Moin,

na ja, ich gebe halt das Pattern für *gültige* Adressen vor und schaue dann, ob die übergebene Adresse diesem entspricht !

Ist also bspw. ein Leerzeichen oder ein Sonderzeichen enthalten, das ist die Adresse halt ungültig !!

Gruß
Klaus


----------



## StefanG (27. Apr 2011)

Ah okay, stimmt. 

Ich habe das einfach mal über meine Testdaten laufen lassen und es werden dann leider Leerzeichen vor und nach dem @ nicht erkannt und als gültige Mail Adresse akzeptiert.


----------



## VfL_Freak (27. Apr 2011)

Moin,

genau, mach das mal 

Du willst doch eigentlich nur wissen, ob die übergebene Adresse gültig ist ... ist die es dem Pattern nach nicht, dann ist sie ja automatisch ungültig 

Auf reine _Ungültigkeit_ per Pattern zu prüfen, wäre sicher der falsche Ansatz !

Gruß
Klaus

*EDIT*
warum sollte <abc.xyz @ 12345.nnn> eine gültige Adresse sein ???:L???:L


----------



## StefanG (27. Apr 2011)

Mit deiner Schablone werden 

mustermann@aol. com 

&

muster mann@aol.com


als gültig erkannt.


----------



## Sym (27. Apr 2011)

Sym hat gesagt.:


> Comparing E-mail Address Validating Regular Expressions
> 
> Das ist immer recht aktuell.


Da zitiere ich mich gerne selbst. 

Hier gibt es ziemlich große und mächtige Regexe. Die musst Du nur für Java anpassen. Da sollte wirklich alles für Dich dabei sein.


----------



## StefanG (27. Apr 2011)

Sym hat gesagt.:


> Da zitiere ich mich gerne selbst.
> 
> Hier gibt es ziemlich große und mächtige Regexe. Die musst Du nur für Java anpassen. Da sollte wirklich alles für Dich dabei sein.



Habe ich mir angeschaut, danke für den Tipp! Ich habe halt nur versucht, die von mir verwendete anzupassen, da die von dir genannten sehr lang und für mich noch schwerer nachzuvollziehen sind.


----------



## VfL_Freak (27. Apr 2011)

Moin,

leider ist das hier von mir übernommene Projekt recht unübersichtlich ... ich sah auch eben, dass hier in meiner SW auch vor dem Aufruf der Validierungsfunktion ggf. vorhandene Leerzeichen entfernt werden 

Aber ich denke auch, das der Link von Sym vielleicht die in Deinem Sinne besseren Pattern enthält ...
Eine gute Übersicht zu den Java Pattern (und zu deren Aufdröselung ) liefert diese Seite: Pattern (Java Platform SE 6)

Gruß
Klaus


----------



## StefanG (28. Apr 2011)

Neue Runde, neues Problem.

Nachdem ich nun die Syntaxprüfung gut am laufen habe, ist mir aufgefallen, dass ich doppelte Mail Adressen habe:

Max.Mustermann@musterdomain.de
max.mustermann@musterdomain.de

Wie kann man soetwas rausfiltern?


----------



## Antoras (28. Apr 2011)

Alle als korrekt erkannten Mail-Adressen mit lowerCase in ein 
	
	
	
	





```
Set<String>
```
 einfügen.


----------



## VfL_Freak (28. Apr 2011)

Moin,

bspw. mit *string.toUpperCase* (wenn es nur reine BUs geht)

```
String s1 = "abc.edf@xyz.de";
String s2 = "ABC.edf@xyz.de";

if( s1.toUpperCase().equals(s2.toUpperCase()) )
{
    // ... irgendwas
}
```

Gruß
Klaus


----------



## StefanG (28. Apr 2011)

```
HashSet<String> hs = new HashSet<String>();

for (int iHashSetCounter = 0; iHashSetCounter < iTokenCounter; iHashSetCounter++) {

       hs.add(sMailRecipients[iHashSetCounter].toLowerCase());
			

}
```

So funktionierts!


----------



## maki (28. Apr 2011)

Anstatt toLowerCase und toUpperCase könnte man auch equalsIgnoreCase nehmen.


----------

