Czego używasz do weryfikacji adresów e-mail użytkowników i dlaczego?
Używałem, validates_email_veracity_of
który faktycznie wysyła zapytania do serwerów MX. Ale jest to pełne niepowodzeń z różnych powodów, głównie związanych z ruchem w sieci i niezawodnością.
Rozejrzałem się i nie mogłem znaleźć niczego oczywistego, czego używa wiele osób do sprawdzania poczytalności adresu e-mail. Czy istnieje do tego utrzymana, dość dokładna wtyczka lub klejnot?
PS: Nie mów mi, żebym wysyłał e-mail z linkiem, aby sprawdzić, czy e-mail działa. Rozwijam funkcję „wyślij do znajomego”, więc nie jest to praktyczne.
ruby-on-rails
validation
email
Luke Francl
źródło
źródło
Odpowiedzi:
W Railsach 3.0 możesz używać sprawdzania poprawności wiadomości e-mail bez wyrażenia regularnego przy użyciu narzędzia Mail .
Oto moja realizacja ( zapakowana jako klejnot ).
źródło
###@domain.com
że potwierdzi?Nie rób tego trudniej, niż powinno. Twoja funkcja nie jest krytyczna; walidacja to tylko podstawowy krok w celu wykrycia literówek. Zrobiłbym to za pomocą prostego wyrażenia regularnego i nie marnowałbym cykli procesora na nic zbyt skomplikowanego:
Zostało to zaadaptowane z http://www.regular-expressions.info/email.html - z którym powinieneś przeczytać, jeśli naprawdę chcesz poznać wszystkie kompromisy. Jeśli chcesz bardziej poprawnego i znacznie bardziej skomplikowanego wyrażenia regularnego, w pełni zgodnego z RFC822, to też jest na tej stronie. Ale rzecz jest taka: nie musisz robić tego całkowicie dobrze.
Jeśli adres przejdzie weryfikację, wyślesz e-mail. Jeśli wiadomość e-mail się nie powiedzie, otrzymasz komunikat o błędzie. W którym momencie możesz powiedzieć użytkownikowi „Przepraszamy, Twój znajomy tego nie otrzymał. Czy chcesz spróbować ponownie?”lub oflaguj do ręcznego sprawdzenia, albo po prostu zignoruj, czy cokolwiek.
Są to te same opcje, z którymi musiałbyś sobie poradzić, gdyby adres miał przechodzi walidacji. Ponieważ nawet jeśli Twoja walidacja jest doskonała i uzyskasz absolutny dowód, że adres istnieje, wysyłanie może się nie powieść.
Koszt fałszywie pozytywnego wyniku walidacji jest niski. Korzyści z lepszej walidacji są również niewielkie. Weryfikuj hojnie i martw się o błędy, gdy się pojawią.
źródło
Stworzyłem klejnot do sprawdzania poprawności wiadomości e-mail w Railsach 3. Jestem trochę zaskoczony, że Railsy domyślnie nie zawierają czegoś takiego.
http://github.com/balexand/email_validator
źródło
if
lubunless
? Dokumentacja wydaje się skromna.Wygląda na to, że ten projekt ma obecnie najwięcej obserwatorów na githubie (do weryfikacji wiadomości e-mail w railsach):
https://github.com/alexdunae/validates_email_format_of
źródło
Z dokumentacji Rails 4 :
źródło
W Rails 4 po prostu dodaj
validates :email, email:true
(zakładając, że twoje pole jest wywoływaneemail
) do swojego modelu, a następnie napisz prostą (lub złożoną †)EmailValidator
według własnych potrzeb.np: - Twój model:
Twój walidator (wchodzi
app/validators/email_validator.rb
)Pozwoli to na wszelkiego rodzaju prawidłowe e-maile, w tym e-maile z tagami, takie jak „[email protected]” i tak dalej.
Aby to przetestować
rspec
w swoimspec/validators/email_validator_spec.rb
Tak właśnie zrobiłem. YMMV
† Wyrażenia regularne są jak przemoc; jeśli nie działają, nie używasz ich wystarczająco dużo.
źródło
Jak sugeruje Hallelujah , uważam, że użycie klejnotu Mail to dobre podejście. Jednak nie podoba mi się niektóre z tamtejszych obręczy.
Używam:
Możesz być bardziej rygorystyczny, żądając, aby TLD (domeny najwyższego poziomu) znajdowały się na tej liście , jednak będziesz zmuszony aktualizować tę listę , gdy pojawią się nowe domeny TLD (takie jak dodanie z 2012 r.
.mobi
I.tel
)Zaletą bezpośredniego przechwycenia parsera jest to, że reguły gramatyki Mail są dość szerokie dla części używanych przez Mail gem. Zostały zaprojektowane tak, aby umożliwić parsowanie adresu podobnego do tego,
user<[email protected]>
który jest powszechny dla SMTP. Konsumując go odMail::Address
ciebie, jesteś zmuszony wykonać kilka dodatkowych kontroli.Kolejna uwaga dotycząca klejnotu Mail, mimo że klasa nazywa się RFC2822, gramatyka zawiera pewne elementy RFC5322 , na przykład ten test .
źródło
W Railsach 3 można napisać walidator wielokrotnego użytku , jak wyjaśnia ten wspaniały post:
http://archives.ryandaigle.com/articles/2009/8/11/what-s-new-in-edge-rails-independent-model-validators
i używaj go z
validates_with
:źródło
Biorąc pod uwagę inne odpowiedzi, nadal pozostaje pytanie - po co zawracać sobie głowę sprytem?
Faktyczna liczba przypadków skrajnych, które wiele wyrażeń regularnych może zaprzeczyć lub pominąć, wydaje się problematyczna.
Myślę, że pytanie brzmi „co próbuję osiągnąć?”, Nawet jeśli „potwierdzasz” adres e-mail, w rzeczywistości nie potwierdzasz, że jest to działający adres e-mail.
Jeśli wybierzesz regexp, po prostu sprawdź obecność @ po stronie klienta.
Jeśli chodzi o niepoprawny scenariusz dotyczący wiadomości e-mail, otrzymaj gałąź „wiadomość nie została wysłana” na Twój kod.
źródło
Istnieją zasadniczo 3 najbardziej typowe opcje:
Jeśli nie chcesz używać zarówno validates_email_veracity_of, jak i generowania tokenów, skorzystałbym ze sprawdzania regexp starej szkoły.
źródło
Klejnot poczty ma wbudowany parser adresów.
źródło
To rozwiązanie jest oparte na odpowiedziach @SFEley i @Alessandro DS, z refaktorem i wyjaśnieniem użytkowania.
Możesz użyć tej klasy walidatora w swoim modelu w następujący sposób:
Zakładając, że masz w swoim
app/validators
folderze (Rails 3):źródło
Do walidacji list mailingowych . (Używam Rails 4.1.6)
Mam stąd moje wyrażenie regularne . Wydaje się, że jest bardzo kompletny i został przetestowany w wielu kombinacjach. Możesz zobaczyć wyniki na tej stronie.
Nieznacznie zmieniłem to na wyrażenie regularne Ruby i umieściłem je w pliku
lib/validators/email_list_validator.rb
Oto kod:
I używam tego w modelu tak:
Sprawdza listy mailingowe takie jak ta, z różnymi separatorami i składnią:
Przed użyciem tego wyrażenia regularnego użyłem
Devise.email_regexp
, ale jest to bardzo proste wyrażenie regularne i nie otrzymałem wszystkich potrzebnych przypadków. Niektóre e-maile spadały.Wypróbowałem inne wyrażenia regularne z sieci, ale ten ma najlepsze wyniki do tej pory. Mam nadzieję, że to pomoże w twoim przypadku.
źródło