Какой самый лучший / простой способ проверить адрес электронной почты в Ruby? - PullRequest
47 голосов
/ 24 января 2011

Какой самый лучший / простой способ проверки адреса электронной почты в ruby ​​(на стороне сервера)?

Ответы [ 10 ]

60 голосов
/ 24 января 2011

Вы можете посмотреть, соответствует ли оно регулярному выражению, подобному тому, которое используется в этом валидаторе Rails:

validates_format_of :email,:with => /\A[^@\s]+@([^@\s]+\.)+[^@\s]+\z/

Но если вы используете Devise, просто выполните:: http://lindsaar.net/2008/4/14/tip-4-detecting-a-valid-email-address

Редактировать 1:

полезный сайт для тестов: http://www.rubular.com/

8 голосов
/ 24 января 2011

в рубине?Так же, как и на любом другом языке.

Отправьте электронное письмо с подтверждением на адрес со ссылкой, по которой получатель должен щелкнуть, прежде чем адрес электронной почты будет считаться полностью подтвержденным.

Существует любое количествопричины, по которым идеально отформатированный адрес все еще может быть недействительным (фактический пользователь по этому адресу не заблокирован спам-фильтрами и т. д.).Единственный способ узнать наверняка - это успешно выполненная сквозная транзакция некоторого описания.

6 голосов
/ 22 декабря 2016
validates :email, presence: true, format: /\w+@\w+\.{1}[a-zA-Z]{2,}/

проверяет, чтобы поле электронной почты не было пустым и чтобы один или несколько символов предшествовали символу @ и следовали за ним

Добавлена ​​конкретность, любые 1 или более символов слова перед символом @и любой 1 или более слова после и между 1 . и не менее 2 букв после

4 голосов
/ 01 мая 2015

Я знаю, что это старый вопрос, но я искал простой способ сделать это. Я столкнулся с email_validator gem , который очень прост в настройке и использовании

как валидатор

validates :my_email_attribute, :email => true

Проверка вне модели

EmailValidator.valid?('narf@example.com') # boolean

Я надеюсь, что это поможет всем.

Happy Codding

4 голосов
/ 30 января 2015

Вы можете использовать

<%=email_field_tag 'to[]','' ,:placeholder=>"Type an email address",:pattern=>"^([\w+-.%]+@[\w-.]+\.[A-Za-z]{2,4},*[\W]*)+$",:multiple => true%>
3 голосов
/ 03 февраля 2018

Вы можете взять ссылку от https://apidock.com/rails/ActiveModel/Validations/HelperMethods/validates_format_of

validates_format_of :email, with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i

3 голосов
/ 03 декабря 2013

Поскольку сайт блога основного ответа был недоступен, вот фрагмент кода с этого сайта через nice cacher или gist :

# http://my.rails-royce.org/2010/07/21/email-validation-in-ruby-on-rails-without-regexp/
class EmailValidator < ActiveModel::EachValidator
  # Domain must be present and have two or more parts.
  def validate_each(record, attribute, value)
    address = Mail::Address.new value
    record.errors[attribute] << (options[:message] || 'is invalid') unless (address.address == value && address.domain && address.__send__(:tree).domain.dot_atom_text.elements.size > 1 rescue false)
  end
end
3 голосов
/ 29 марта 2013

Форма ярлыка:

 validates :email, :format => /@/

Нормальная форма (регулярное выражение):

validates :email, :format => { :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/ }

Источник: Класс валидатора

2 голосов
/ 10 января 2019

Если вы используете Rails / Devise - дополнение к ответу @ apneadiving`s -

validates_format_of :email,:with => Devise::email_regexp

Devise :: email_regexp берется из config / initializer / devise.rb

config.email_regexp = /\A[^@\s]+@([^@\s]+\.)+[^@\s]+\z/
2 голосов
/ 24 января 2011

Отправьте письмо с подтверждением, и я обычно буду использовать этот валидатор ... D.R.Y.

# lib/email_validator.rb
class EmailValidator < ActiveModel::EachValidator

  EmailAddress = begin
    qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]'
    dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]'
    atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-' +
      '\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+'
    quoted_pair = '\\x5c[\\x00-\\x7f]'
    domain_literal = "\\x5b(?:#{dtext}|#{quoted_pair})*\\x5d"
    quoted_string = "\\x22(?:#{qtext}|#{quoted_pair})*\\x22"
    domain_ref = atom
    sub_domain = "(?:#{domain_ref}|#{domain_literal})"
    word = "(?:#{atom}|#{quoted_string})"
    domain = "#{sub_domain}(?:\\x2e#{sub_domain})*"
    local_part = "#{word}(?:\\x2e#{word})*"
    addr_spec = "#{local_part}\\x40#{domain}"
    pattern = /\A#{addr_spec}\z/
  end

  def validate_each(record, attribute, value)
    unless value =~ EmailAddress
      record.errors[attribute] << (options[:message] || "is not valid") 
    end
  end

end

в вашей модели

validates :email , :email => true

или

 validates :email, :presence => true, 
                :length => {:minimum => 3, :maximum => 254},
                :uniqueness => true,
                :email => true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...