Was ist die beste Validierungsmethode für Java-E-Mail-Adressen? [closed]

Lesezeit: 8 Minuten

Was ist die idiomatische Methode um eine URL oder einen
jon077

Was sind die guten E-Mail-Adressvalidierungsbibliotheken für Java? Gibt es Alternativen zu Commons-Validator?

  • 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


Was ist die beste Validierungsmethode fur Java E Mail Adressen closed
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 und 123. 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

1646272631 969 Was ist die beste Validierungsmethode fur Java E Mail Adressen closed
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

Was ist die beste Validierungsmethode fur Java E Mail Adressen closed
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

Was ist die beste Validierungsmethode fur Java E Mail Adressen closed
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:

Geben Sie hier die Bildbeschreibung ein

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


1646272632 647 Was ist die beste Validierungsmethode fur Java E Mail Adressen closed
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


1646272632 772 Was ist die beste Validierungsmethode fur Java E Mail Adressen closed
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


918430cookie-checkWas ist die beste Validierungsmethode für Java-E-Mail-Adressen? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy