Что вы используете для проверки адресов электронной почты пользователей и почему?
Я использовал, validates_email_veracity_of
который фактически запрашивает серверы MX. Но это полно сбоев по разным причинам, в основном связанных с сетевым трафиком и надежностью.
Я огляделся и не нашел ничего очевидного, что многие люди используют для проверки правильности адреса электронной почты. Есть ли для этого поддерживаемый, достаточно точный плагин или гем?
PS: Пожалуйста, не просите меня отправлять электронное письмо со ссылкой, чтобы проверить, работает ли оно. Я разрабатываю функцию «отправить другу», поэтому это непрактично.
ruby-on-rails
validation
email
Люк Франкл
источник
источник
Ответы:
В Rails 3.0 вы можете использовать проверку электронной почты без регулярного выражения с помощью гема Mail .
Вот моя реализация ( упакованная как драгоценный камень ).
источник
###@domain.com
будет подтверждать?Не усложняйте это сложнее, чем должно быть. Ваша функция не критична; проверка - это всего лишь базовый шаг в здравом уме, чтобы отловить опечатки. Я бы сделал это с помощью простого регулярного выражения и не тратил циклы ЦП на что-то слишком сложное:
Это было адаптировано из http://www.regular-expressions.info/email.html - вам следует прочитать, если вы действительно хотите знать все компромиссы. Если вам нужно более правильное и намного более сложное, полностью совместимое с RFC822 регулярное выражение, это тоже на этой странице. Но дело в том, что вам не нужно понимать это полностью правильно.
Если адрес прошел проверку, вы отправите электронное письмо. Если электронная почта не удалась, вы получите сообщение об ошибке. В этот момент вы можете сказать пользователю: «Извините, ваш друг не получил это, вы хотите попробовать еще раз?» или пометьте его для просмотра вручную, или просто проигнорируйте, или что-то еще.
Это те же самые опции , которые вы хотите иметь дело с тем, если адрес действительно проходит проверку. Потому что даже если ваша проверка идеальна и вы получите абсолютное доказательство того, что адрес существует, отправка все равно может завершиться ошибкой.
Стоимость ложного срабатывания при проверке невысока. Преимущество лучшей проверки также невелико. Щедро проверяйте и беспокоитесь об ошибках, когда они произойдут.
источник
Я создал гем для проверки электронной почты в Rails 3. Я немного удивлен, что Rails не включает что-то подобное по умолчанию.
http://github.com/balexand/email_validator
источник
if
илиunless
? Документация кажется скудной.Похоже, что на данный момент у этого проекта больше всего наблюдателей на github (для проверки электронной почты в рельсах):
https://github.com/alexdunae/validates_email_format_of
источник
Из документов Rails 4 :
источник
В Rails 4 просто добавьте
validates :email, email:true
(при условии, что ваше поле вызываетсяemail
) в вашу модель, а затем напишите простой (или сложный †)EmailValidator
в соответствии с вашими потребностями.например: - ваша модель:
Ваш валидатор (входит
app/validators/email_validator.rb
)Это позволит использовать все виды действительных электронных писем, включая электронные письма с тегами, например «test+no_really@test.tes» и так далее.
Чтобы проверить это
rspec
в вашемspec/validators/email_validator_spec.rb
Во всяком случае, я так и сделал. YMMV
† Регулярные выражения подобны насилию; если они не работают, вы используете их недостаточно.
источник
Как предлагает Аллилуйя, я думаю, что использование гема Mail - хороший подход. Однако некоторые обручи там мне не нравятся.
Я использую:
Вы могли бы быть строже, потребовав, чтобы TLD (домены верхнего уровня) были в этом списке , однако вам придется обновлять этот список по мере появления новых TLD (например, добавление 2012 года
.mobi
и.tel
)Преимущество прямого подключения парсера заключается в том, что правила грамматики Mail довольно широки для частей, которые использует Mail gem, они предназначены для того, чтобы позволить ему анализировать адрес, подобный тому,
user<user@example.com>
который является общим для SMTP. Потребляя его из магазина,Mail::Address
вы вынуждены делать кучу дополнительных проверок.Еще одно замечание относительно гема Mail, хотя класс называется RFC2822, в грамматике есть некоторые элементы RFC5322 , например этот тест .
источник
В Rails 3 можно написать многоразовый валидатор, как объясняется в этом замечательном посте:
http://archives.ryandaigle.com/articles/2009/8/11/what-s-new-in-edge-rails-independent-model-validators
и используйте его с
validates_with
:источник
Принимая во внимание другие ответы, вопрос все еще остается - зачем думать об этом?
Фактический объем крайних случаев, которые многие регулярные выражения могут отрицать или пропускать, кажется проблематичным.
Я думаю, что вопрос в том, «чего я пытаюсь достичь?», Даже если вы «проверяете» адрес электронной почты, вы на самом деле не подтверждаете, что это рабочий адрес электронной почты.
Если вы выбираете регулярное выражение, просто проверьте наличие @ на стороне клиента.
Что касается неправильного сценария электронной почты, в вашем коде должна быть ветка «сообщение не удалось отправить».
источник
Есть три основных варианта:
Если вы не хотите использовать как validates_email_veracity_of, так и генерацию токенов, я бы пошел с проверкой регулярного выражения старой школы.
источник
Гем Mail имеет встроенный анализатор адресов.
источник
Это решение основано на ответах @SFEley и @Alessandro DS, с рефакторингом и разъяснением использования.
Вы можете использовать этот класс валидатора в своей модели следующим образом:
Если у вас в
app/validators
папке (Rails 3) есть следующее:источник
Для проверки списков рассылки . (Я использую Rails 4.1.6)
Отсюда я получил свое регулярное выражение . Он кажется очень полным и протестирован на большом количестве комбинаций. Вы можете увидеть результаты на этой странице.
Я немного изменил его на регулярное выражение Ruby и поместил в свой
lib/validators/email_list_validator.rb
Вот код:
А в модели я использую вот так:
Он будет проверять списки рассылки, подобные этому, с разными разделителями и синтаксисом:
Перед использованием этого регулярного выражения я использовал
Devise.email_regexp
, но это очень простое регулярное выражение, и я не получил всех необходимых мне случаев. Некоторые электронные письма неуклюжи.Я пробовал другие регулярные выражения из Интернета, но до сих пор у этого были лучшие результаты. Надеюсь, это поможет в вашем случае.
источник