Pytanie Jaka jest najlepsza metoda sprawdzania adresu e-mail Java? [Zamknięte]


Jakie są dobre biblioteki sprawdzania adresów e-mail dla Javy? Czy są jakieś alternatywy dla walidator commons?


248
2018-03-08 23:51


pochodzenie


Zostawię to tutaj: davidcelis.com/blog/2012/09/06/... - misha
Aktualny adres URL dla Commons: commons.apache.org/proper/commons-validator/apidocs/org/apache/... - james.garriss
Nie powinieneś chcieć używać bibliotek (lub wyrażeń regularnych), które nie są wszechstronnie sprawdzane. Ze względu na złożoność poprawnego adresu e-mail nie ma pośredniego punktu pomiędzy brakiem walidacji a wszechstronnym sprawdzaniem poprawności. Implementacja Apache Commons jest nie wszechstronny. Jestem świadomy tylko jednej biblioteki, która jest (email-rfc2822-validator), ale nadal działa z dużymi wyrażeń regularnych. Kompleksowy Lexer jest to, czego naprawdę chcesz. EmailValidator4J mówi, że wykonuje to zadanie, ale nie mam z tym doświadczenia. - Benny Bottema
@BennyBottema Zamiast edytować pytanie z komentarzem, proszę zrób post Meta, aby przedyskutować, dlaczego został zamknięty, jeśli nadal masz pytania. - Machavity


Odpowiedzi:


Apache Commons jest ogólnie znany jako solidny projekt. Pamiętaj jednak, że nadal będziesz musiał wysłać e-mail weryfikacyjny na adres, aby upewnić się, że jest to prawdziwa wiadomość e-mail, a właściciel chce, aby była używana w Twojej witrynie.

EDYTOWAĆ: To było pluskwa gdzie była zbyt restrykcyjna w domenie, powodując, że nie akceptowała poprawnych wiadomości e-mail od nowych TLD.

Ten błąd został rozwiązany w dniu 03 / Jan / 15 02:48 w commons-validator wersja 1.4.1


134
2018-03-08 23:57



Zgadzam się z dodatkowymi fragmentami, które cytowałeś, ale czy są to elementy projektu Walidacji Commons? - duffymo
Nie, Apache EmailValidator klasa nie wysyła wiadomości e-mail do weryfikacji. - Matthew Flaschen
Jeśli Twój przypadek użycia służy do sprawdzania zdalnego adresu e-mail użytkownika, to rozwiązanie ma znaczną wadę (podobną do adresu InternetAddress.validate ()): EmailValidator uważa użytkownika @ [10.9.8.7] za poprawny adres e-mail - który jest zgodny z RFC, ale może nie do rejestracji użytkownika / formularza kontaktowego. - zillion1
@zillion, który jest udokumentowany w Apache COmmons: "Ta implementacja nie gwarantuje wychwycenia wszystkich możliwych błędów w adresie e-mail." Powiedziałem, co musisz zrobić, aby "upewnić się, że to prawdziwy e-mail". Adresy z lokalnymi adresami IP mogą być jednak ważne w rzadkich środowiskach. - Matthew Flaschen
Apache Commons EmailValidator ma jedną poważną wadę: nie obsługuje IDN. - Piohen


Używając oficjalny pakiet wiadomości java jest najłatwiejszy:

public static boolean isValidEmailAddress(String email) {
   boolean result = true;
   try {
      InternetAddress emailAddr = new InternetAddress(email);
      emailAddr.validate();
   } catch (AddressException ex) {
      result = false;
   }
   return result;
}

261
2018-05-09 01:53



Zauważ, że InternetAddress.validate () traktuje użytkownika @ [10.9.8.7] i użytkownika @ localhost jako prawidłowe adresy e-mail - które są zgodne z RFC. Chociaż, w zależności od przypadku użycia (formularza internetowego), możesz traktować je jako nieprawidłowe. - zillion1
nie tylko to jest ważne, jak powiedział @ zillion1, ale także takie rzeczy jak bla @ bla są uważane za ważne. Naprawdę nie najlepsze rozwiązanie. - Diego Plentz
@NicholasTolleyCottrell To jest Java, tutaj wyrzucamy i łapiemy wyjątki, naprawdę nie rozumiem - gyorgyabraham
Podejrzeń, że konstruktor InternetAddress został naruszony. Lub mój system został naruszony. Lub RFC822 został naruszony. Albo naprawdę mógłbym teraz trochę spać. Ale po prostu wypróbowałem jakiś kod, a pięć kolejnych ciągów przekazuje jako poprawne adresy e-mail, jeśli przekazujesz je do konstruktora InternetAddress i "wyraźnie", są one niepoprawne. No to ruszamy: ., .com, com., abc i 123. Dodanie wiodącej lub końcowej białej spacji również nie powoduje unieważnienia ciągów. Jesteś sędzią! - Martin Andersson
um, ser zawodzi, gdy go uruchomię. do czego do licha biblioteka javax.mail linkujesz ??? - Aaron Davidson


Walidator Apache Commons może być użyty, jak wspomniano w innych odpowiedziach.

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'

Import:

import org.apache.commons.validator.routines.EmailValidator;

Kod:

String email = "myName@example.com";
boolean valid = EmailValidator.getInstance().isValid(email);

i aby zezwolić na adresy lokalne

boolean allowLocal = true;
boolean valid = EmailValidator.getInstance(allowLocal).isValid(email);

91
2017-11-01 08:55



To rozwiązanie powinno być na wierzchu! - amanteaux
W Android Studio możesz dodać kompilator 'commons-validator: commons-validator: 1.4.1' do zależności twoich app \ build.gradle {} - Benjiko99
Po próbie zbudowania mojego projektu wydaje się, że Apache commons nie działa dobrze z Androidem, setkami ostrzeżeń i kilkoma błędami, których nawet nie skompilował. Właśnie tego użyłem howtodoinjava.com/2014/11/11/java-regex-validate-email-address - Benjiko99
Ten sam problem dotyczy mnie jak Benjiko99. Po dodaniu zależności projekt się nie skompiluje, mówi java.exe zakończony niezerowym kodem wyjścia 2. - Amit Mittal
Otrzymałem również błędy w Android Studio. Zmieniłem z wersji 1.4.1 na 1.5.1 i działa! - Matt


Późna odpowiedź, ale myślę, że jest prosta i godna:

    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();
    }

Przypadki testowe:

enter image description here

Do celów produkcyjnych sprawdzanie poprawności nazw domen powinno odbywać się w sposób sieciowy.


71
2018-04-17 10:49



To dość brutalnie uproszczony walidator, który ignoruje większość reguł RFC wraz z IDN. Pozbyłbym się tego dla dowolnej aplikacji o jakości produkcji. - mlaccetti
me@company.co.uk będzie nieprawidłowe ... - Alexander Burakevych
Nie należy uruchamiać własnego sprawdzania poprawności opartego na reggerze dla obiektów objętych specyfikacjami RFC. - Josh Glover
Wymyślanie koła jest OK, o ile nie masz nic przeciwko okazjonalnej, płaskiej oponie - dldnh
to jest dobre, ale nie we wszystkich przypadkach. - Andrain


Jeśli próbujesz wykonać sprawdzanie formularza otrzymane od klienta lub po prostu sprawdzanie fasoli - zachowaj to w prostocie. Lepiej przeprowadzić luźną walidację e-maili niż wykonać ścisłą weryfikację i odrzucić niektóre osoby (np. Gdy próbują zarejestrować się w usłudze sieciowej). Z prawie wszystkim dozwolonym w części nazwy użytkownika e-maila i wielu nowych domenach dodawanych dosłownie co miesiąc (np. .Company, .entreprise, .estate), bezpieczniej jest nie być restrykcyjnym:

Pattern pattern = Pattern.compile("^.+@.+\\..+$");
Matcher matcher = pattern.matcher(email);

21
2018-06-20 06:08



jest to naprawdę dobry punkt, każda rozsądna aplikacja powinna mieć inne środki, aby zapobiec wykorzystaniu tego sygnału w dół - jmaculate
Co powiesz na zmianę na "^. + @. + (\\. [^ \\.] +) + $", Aby uniknąć kropki z kropkami? - Xingang Huang


Późno na to pytanie, ale: Prowadzę zajęcia pod tym adresem: http://lacinato.com/cm/software/emailrelated/emailaddress

Opiera się na klasie Les Hazlewooda, ale ma wiele ulepszeń i naprawia kilka błędów. Licencja Apache.

Uważam, że jest to najbardziej sprawny parser poczty e-mail w Javie, a ja jeszcze nie widzę jednego zdolnego do pracy w jakimkolwiek języku, choć może istnieć. To nie jest parser w stylu leksykonu, ale używa skomplikowanego wyrażenia java, a więc nie jest tak efektywny, jak to tylko możliwe, ale moja firma przeanalizowała z powodzeniem ponad 10 miliardów adresów w świecie rzeczywistym: jest na pewno użyteczna w wysokiej wydajności sytuacja. Może raz w roku trafi na adres, który powoduje przepełnienie stosu regex (odpowiednio), ale są to adresy spamowe, które mają setki lub tysiące znaków z wieloma cytatami i nawiasami i tym podobne.

RFC 2822 a związane z nimi specyfikacje są naprawdę bardzo permisywne pod względem adresów e-mail, więc taka klasa jest przesadą dla większości zastosowań. Na przykład: legalny adres, zgodnie ze spec, spacje i wszystkie:

"<bob \" (here) " < (hi there) "bob(the man)smith" (hi) @ (there) example.com (hello) > (again)

Żaden serwer pocztowy by na to nie pozwolił, ale ta klasa może go parsować (i przepisać na użyteczny formularz).

Odkryliśmy, że istniejące opcje analizatora e-maili w Javie są niewystarczająco trwałe (co oznacza, że ​​nie można przetworzyć niektórych poprawnych adresów), więc stworzyliśmy tę klasę.

Kod jest dobrze udokumentowany i zawiera wiele łatwych do zmiany opcji zezwalania lub blokowania niektórych formularzy e-mail. Zapewnia także wiele metod uzyskiwania dostępu do niektórych części adresu (po lewej stronie, prawej stronie, nazwisk osobistych, komentarzy itp.), Aby parsować / sprawdzać nagłówki list-skrzynek, aby przeanalizować / zweryfikować ścieżkę zwrotną (co jest unikalne wśród nagłówków) i tak dalej.

Kod w formie pisemnej ma zależność od javamail, ale można go łatwo usunąć, jeśli nie chcesz korzystać z mniejszej funkcjonalności.


7
2017-10-30 06:36



Cześć, skopiowałem go do GitHub, aby udostępnić społeczność open source. Teraz każdy może komentować, dokumentować i ulepszać kod. github.com/bbottema/email-rfc2822-validator. Używałem starszej wersji przez Lesa, ale musiałem go usunąć z powodu błędów zamrażania regex: leshazlewood.com/2006/11/06/emailaddress-java-class/... - Benny Bottema


Zastanawiam się tylko, dlaczego nikt nie wymyślił @Email z dodatkowych ograniczeń Hibernate Validator. Sam walidator to EmailValidator.


7
2018-04-01 02:56



Chociaż jest to alternatywa dla wspólnych bibliotek Apache, jego implementacja jest tak samo pobieżna, jak większość bibliotek opartych na regexie. Z dokumentów: "Jednak, jak omawia ten artykuł, nie zawsze jest praktyczne wdrożenie weryfikującego e-mail w 100%". Jedynym wszechstronnym weryfikatorem opartym na regex, jaki znam, jest email-rfc2822-validator i inaczej EmailValidator4J wydaje się obiecujący. - Benny Bottema


Les Hazlewood napisał bardzo dokładną klasę sprawdzania poprawności wiadomości e-mail zgodną z RFC 2822 przy użyciu wyrażeń regularnych Java. Możesz go znaleźć w http://www.leshazlewood.com/?p=23. Jednak jego dokładność (lub implementacja Java RE) prowadzi do nieefektywności - przeczytaj komentarze na temat czasu analizowania długich adresów.


5
2017-08-24 10:49



Zbudowałem doskonałą klasę Les Hazlewood (która ma kilka błędów). (Zobacz moją oddzielną odpowiedź na to pytanie.) Chociaż utrzymałem metodę regex java, używamy jej w porządku w środowisku o krytycznym znaczeniu dla wydajności. Jeśli wszystko, co robisz, to analizowanie adresów, wydajność może być problemem, ale dla większości użytkowników podejrzewam, że to tylko początek tego, co robią. Moje aktualizacje klasy również rozwiązały szereg problemów z długą rekurencją. - lacinato
To jest przestarzała biblioteka i została zastąpiona dwukrotnie, w końcu przez email-rfc2822-validator. Mimo, że nadal pasuje do wszystkich współczesnych potrzeb, wciąż jest podatny na ukryte błędy wydajności (i nie obsługuje ograniczonych zmian przez nowsze specyfikacje RFC). - Benny Bottema