Was sind die guten E-Mail-Adressvalidierungsbibliotheken für Java? Gibt es Alternativen zu Commons-Validator?
Was ist die beste Validierungsmethode für Java-E-Mail-Adressen? [closed]
jon077
Aaron Davidson
Verwendung der offizielles Java-E-Mail-Paket ist am einfachsten:
public static boolean isValidEmailAddress(String email) {
boolean result = true;
try {
InternetAddress emailAddr = new InternetAddress(email);
emailAddr.validate();
} catch (AddressException ex) {
result = false;
}
return result;
}
-
Beachten Sie, dass InternetAddress.validate() user@ berücksichtigt[10.9.8.7] und user@localhost als gültige E-Mail-Adressen – was sie laut RFC sind. Je nach Anwendungsfall (Webformular) möchten Sie sie jedoch möglicherweise als ungültig behandeln.
– Millionen1
5. Oktober 2011 um 8:30 Uhr
-
nicht nur das ist gültig, wie @zillion1 sagte, sondern auch Dinge wie bla@bla gelten als gültig. Wirklich nicht die beste Lösung.
– Diego Plentz
20. November 2012 um 17:30 Uhr
-
@NicholasTolleyCottrell Das ist Java, hier werfen und fangen wir Ausnahmen ab, ich verstehe nicht wirklich, worauf Sie hinauswollen
– gyorgyabraham
25. Januar 2013 um 15:44 Uhr
-
Ich vermute, dass der InternetAddress-Konstruktor manipuliert wurde. Oder mein System wurde manipuliert. Oder RFC822 wurde manipuliert. Oder ich könnte jetzt wirklich etwas Schlaf gebrauchen. Aber ich habe gerade etwas Code ausprobiert und die folgenden fünf Zeichenfolgen werden alle als gültige E-Mail-Adressen übergeben, wenn Sie sie an den InternetAddress-Konstruktor übergeben, und “eindeutig” sind sie nicht gültig. Auf geht’s:
.
,.com
,com.
,abc
und123
. Auch das Hinzufügen von führenden oder nachgestellten Leerzeichen macht die Zeichenfolgen nicht ungültig. Du entscheidest!– Martin Andersson
19. März 2013 um 21:12 Uhr
-
ähm, Käse versagt richtig, wenn ich ihn laufen lasse. mit welcher javax.mail-Bibliothek verlinken Sie???
– Aaron Davidson
12. Februar 2015 um 19:37 Uhr
Matthäus Flaschen
Apache Commons ist allgemein als solides Projekt bekannt. Denken Sie jedoch daran, dass Sie immer noch eine Bestätigungs-E-Mail an die Adresse senden müssen, wenn Sie sicherstellen möchten, dass es sich um eine echte E-Mail handelt und der Eigentümer möchte, dass sie auf Ihrer Website verwendet wird.
BEARBEITEN: Da war ein Insekt wo es für die Domäne zu restriktiv war, was dazu führte, dass es keine gültigen E-Mails von neuen TLDs akzeptierte.
Dieser Fehler wurde am 03. Januar 2015 um 14:48 Uhr behoben Commons-Validator Version 1.4.1
-
Ich stimme den von Ihnen zitierten zusätzlichen Bits zu, aber sind diese Teil des Commons Validation-Projekts?
– Duffymo
9. März 2009 um 0:33 Uhr
-
Nein, der Apache
EmailValidator
Klasse sendet keine E-Mail-Nachricht zur Überprüfung.– Matthäus Flaschen
14. Juli 2011 um 18:34 Uhr
-
Wenn Ihr Anwendungsfall darin besteht, die Remote-E-Mail-Adresse eines Benutzers zu validieren, hat diese Lösung einen erheblichen Fehler (ähnlich wie InternetAddress.validate()): EmailValidator berücksichtigt user@[10.9.8.7] als gültige E-Mail-Adressen – was sie laut RFC sind, aber möglicherweise nicht für die Benutzerregistrierung / das Kontaktformular.
– Millionen1
5. Oktober 2011 um 9:45 Uhr
-
@zillion, das in Apache COMmons dokumentiert ist: „Es ist nicht garantiert, dass diese Implementierung alle möglichen Fehler in einer E-Mail-Adresse abfängt.“ Und ich sagte, was Sie tun müssen, um sicherzustellen, dass es sich um eine echte E-Mail handelt. Adressen mit lokalen IPs könnten jedoch in seltenen Umgebungen gültig sein.
– Matthäus Flaschen
5. Oktober 2011 um 22:11 Uhr
-
Apache Commons EmailValidator hat einen schwerwiegenden Nachteil: IDN wird nicht unterstützt.
– Piohen
5. Juni 2014 um 10:50 Uhr
Aksel Willgert
Der Apache Commons-Validator kann wie in den anderen Antworten erwähnt verwendet werden.
pom.xml:
<dependency>
<groupId>commons-validator</groupId>
<artifactId>commons-validator</artifactId>
<version>1.4.1</version>
</dependency>
build.gradle:
compile 'commons-validator:commons-validator:1.4.1'
Der Import:
import org.apache.commons.validator.routines.EmailValidator;
Der Code:
String email = "[email protected]";
boolean valid = EmailValidator.getInstance().isValid(email);
und um lokale Adressen zuzulassen
boolean allowLocal = true;
boolean valid = EmailValidator.getInstance(allowLocal).isValid(email);
-
In Android Studio können Sie „commons-validator:commons-validator:1.4.1“ in die Abhängigkeiten Ihrer app\build.gradle kompilieren {}
– zOqvxf
11. Dezember 2015 um 17:08 Uhr
-
Nachdem ich tatsächlich versucht habe, mein Projekt zu erstellen, scheint Apache Commons nicht sehr gut mit Android zu funktionieren, Hunderte von Warnungen und einige Fehler, es wurde nicht einmal kompiliert. Dies ist, was ich am Ende verwendet habe howtodoinjava.com/2014/11/11/java-regex-validate-email-address
– zOqvxf
12. Dezember 2015 um 11:39 Uhr
-
Bei mir das gleiche Problem wie bei Benjiko99. Nach dem Hinzufügen der Abhängigkeit wird das Projekt nicht kompiliert, sagt java.exe wurde mit Exit-Code 2 ungleich Null beendet.
– Amit Mittal
18. März 2016 um 21:01 Uhr
-
Ich habe auch Fehler in Android Studio bekommen. Ich habe von 1.4.1 auf 1.5.1 gewechselt und es funktioniert!
– Matt
11. Oktober 2016 um 22:20 Uhr
-
Hinweis: Use_the Emailvalidator in org.apache.commons.validator.routines da EmailValidator in org.apache.commons.validator veraltet ist (ich verwende 1.6 commons Validator)
– HopeKing
22. Dezember 2017 um 3:55 Uhr
Pujan
Späte Antwort, aber ich denke, es ist einfach und würdig:
public boolean isValidEmailAddress(String email) {
String ePattern = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$";
java.util.regex.Pattern p = java.util.regex.Pattern.compile(ePattern);
java.util.regex.Matcher m = p.matcher(email);
return m.matches();
}
Testfälle:
Für Produktionszwecke sollten Domänennamenvalidierungen netzwerkweise durchgeführt werden.
Wenn Sie versuchen, eine vom Client empfangene Formularvalidierung oder nur eine Bean-Validierung durchzuführen, halten Sie es einfach. Es ist besser, eine lockere E-Mail-Validierung durchzuführen, als eine strenge und einige Leute abzulehnen (z. B. wenn sie versuchen, sich für Ihren Webdienst zu registrieren). Da im Benutzernamensteil der E-Mail fast alles erlaubt ist und buchstäblich jeden Monat so viele neue Domains hinzugefügt werden (z. B. .company, .entreprise, .estate), ist es sicherer, nicht restriktiv zu sein:
Pattern pattern = Pattern.compile("^.+@.+\\..+$");
Matcher matcher = pattern.matcher(email);
-
Das ist ein wirklich guter Punkt, jede vernünftige App sollte andere Maßnahmen haben, um zu verhindern, dass diese Eingabe auf der ganzen Linie ausgenutzt wird
– makellos
12. Dezember 2014 um 18:04 Uhr
-
Wie wäre es mit “^.+@.+(\\.[^\\.]+)+$”, um einen nachgestellten Punkt zu vermeiden?
– Alpha Huang
30. Juni 2015 um 18:54 Uhr
lacinato
Spät zur Frage hier, aber: Ich unterhalte eine Klasse unter dieser Adresse: http://lacinato.com/cm/software/emailrelated/emailaddress
Es basiert auf der Klasse von Les Hazlewood, hat aber zahlreiche Verbesserungen und behebt ein paar Fehler. Apache-Lizenz.
Ich glaube, es ist der leistungsfähigste E-Mail-Parser in Java, und ich habe noch keinen leistungsfähigeren in irgendeiner Sprache gesehen, obwohl es möglicherweise einen gibt. Es ist kein Parser im Lexer-Stil, sondern verwendet einen komplizierten Java-Regex und ist daher nicht so effizient, wie es sein könnte, aber mein Unternehmen hat weit über 10 Milliarden reale Adressen damit geparst: Es ist sicherlich in einer Hochleistungsanwendung verwendbar Lage. Vielleicht trifft es einmal im Jahr auf eine Adresse, die einen Regex-Stapelüberlauf verursacht (angemessen), aber das sind Spam-Adressen, die Hunderte oder Tausende von Zeichen lang sind, mit vielen, vielen Anführungszeichen und Klammern und dergleichen.
RFC-2822 und die zugehörigen Spezifikationen sind in Bezug auf E-Mail-Adressen wirklich recht freizügig, sodass eine Klasse wie diese für die meisten Anwendungen übertrieben ist. Zum Beispiel ist das Folgende eine legitime Adresse, gemäß Spezifikation, Leerzeichen und allem:
"<bob \" (here) " < (hi there) "bob(the man)smith" (hi) @ (there) example.com (hello) > (again)
Kein Mailserver würde das zulassen, aber diese Klasse kann es parsen (und in eine verwendbare Form umschreiben).
Wir haben festgestellt, dass die vorhandenen Java-E-Mail-Parser-Optionen nicht dauerhaft genug sind (was bedeutet, dass alle einige gültige Adressen nicht parsen konnten), also haben wir diese Klasse erstellt.
Der Code ist gut dokumentiert und hat viele einfach zu ändernde Optionen, um bestimmte E-Mail-Formulare zuzulassen oder zu verbieten. Es bietet auch viele Methoden, um auf bestimmte Teile der Adresse zuzugreifen (linke Seite, rechte Seite, Personennamen, Kommentare usw.), um Postfachlisten-Header zu parsen/validieren, um den Rückgabepfad zu parsen/validieren (der unter den Headern einzigartig ist) und so weiter.
Der geschriebene Code hat eine Javamail-Abhängigkeit, aber er ist leicht zu entfernen, wenn Sie die kleinere Funktionalität, die er bietet, nicht möchten.
-
Das ist ein wirklich guter Punkt, jede vernünftige App sollte andere Maßnahmen haben, um zu verhindern, dass diese Eingabe auf der ganzen Linie ausgenutzt wird
– makellos
12. Dezember 2014 um 18:04 Uhr
-
Wie wäre es mit “^.+@.+(\\.[^\\.]+)+$”, um einen nachgestellten Punkt zu vermeiden?
– Alpha Huang
30. Juni 2015 um 18:54 Uhr
Markus Malkusch
Ich frage mich nur, warum niemand darauf gekommen ist @Email
von den zusätzlichen Beschränkungen des Hibernate Validator. Der Validator selbst ist EmailValidator
.
-
Obwohl es eine Alternative zu Apache Commons ist, ist seine Implementierung so rudimentär wie die meisten Regex-basierten Bibliotheken. Aus den Dokumenten: “Da in diesem Artikel jedoch erörtert wird, ist es nicht unbedingt praktikabel, einen 100% kompatiblen E-Mail-Validator zu implementieren”. Der einzige Regex-basierte umfassende Validator, den ich kenne, ist email-rfc2822-validator und ansonsten EmailValidator4J scheint vielversprechend.
– Benny Bottema
29. Dezember 2017 um 8:50 Uhr
Ich lasse das einfach hier: davidcelis.com/blog/2012/09/06/…
– mpenkow
30. Oktober 2012 um 6:44 Uhr
Aktuelle URL für Commons: commons.apache.org/proper/commons-validator/apidocs/org/apache/…
– james.garriss
16. Juni 2014 um 11:30 Uhr
Sie sollten keine Bibliotheken (oder regulären Ausdrücke) verwenden, die nicht umfassend validieren. Aufgrund der Komplexität gültiger E-Mail-Adressen gibt es keinen Mittelweg zwischen keiner Validierung und umfassender Validierung. Die Implementierung von Apache Commons ist nicht umfassend. Mir ist nur eine Bibliothek bekannt, die (email-rfc2822-validator), aber es funktioniert immer noch mit riesigen regulären Ausdrücken. Eine umfassende Lexer ist das, was du wirklich willst. EmailValidator4J sagt, es macht den Job, aber ich habe keine Erfahrung damit.
– Benny Bottema
29. Dezember 2017 um 10:10 Uhr
@BennyBottema Anstatt die Frage mit Kommentaren zu bearbeiten, erstellen Sie bitte einen Meta-Beitrag, um zu besprechen, warum dies geschlossen wurde, wenn Sie noch Fragen haben.
– Machatität
♦
29. Juni 2018 um 16:48 Uhr