Как я могу проверить несколько адресов электронной почты в модели? - PullRequest
1 голос
/ 10 августа 2009

например: запятая в одном текстовом поле: mail1@domain.com, mail2 @ someotherdomain, ...

Ответы [ 4 ]

6 голосов
/ 10 августа 2009

Вы можете использовать модуль TMail :: Address для проверки электронной почты как , показанное здесь . Пользовательские проверки могут быть добавлены с помощью метода validate.

validate :check_email_addresses

def check_email_addresses
  email_addresses.split(/,\s*/).each do |email|
    TMail::Address.parse(email)
  end
rescue TMail::SyntaxError
  errors.add(:email_addresses, "are not valid")
end

Обновление: Модуль TMail :: Address кажется слишком слабым в отношении того, что считается действительным адресом электронной почты (см. Комментарии ниже), поэтому вместо этого вы можете использовать регулярное выражение.

validate :check_email_addresses

def check_email_addresses
  email_addresses.split(/,\s*/).each do |email| 
    unless email =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
      errors.add(:email_addresses, "are invalid due to #{email}")
    end
  end
end

Существует множество решений с регулярными выражениями для проверки адреса электронной почты. Подробнее см. на этой странице .

2 голосов
/ 29 августа 2009

Если кто-то пытается проанализировать список адресов с именами в нем, как это может появиться в заголовке электронного письма, я нашел самый простой способ сделать это:

header = TMail::HeaderField.new('to', address_list_string)

header.addrs будет содержать массив TMail::Address объектов, к которым вы можете получить доступ по имени, адресу электронной почты, домену и т. Д.

1 голос
/ 11 августа 2009

Я использую следующее:

<code>
module EmailValidator
  self.email_name_regex  = '[\w.%+-]+'.freeze
  self.domain_head_regex = '(?:[A-Z0-9-]+.)+'.freeze
  self.domain_tld_regex  = '(?:[A-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|jobs|museum)'.freeze
  self.bracketed_email_regex = /\A.<em><\s</em>(#{email_name_regex}@#{domain_head_regex}#{domain_tld_regex})\s*>.<em>\z/i
  self.unbracketed_email_regex = /\A\s</em>(#{email_name_regex}@#{domain_head_regex}#{domain_tld_regex})\s*\z/i</p>

<p>def self.valid_email?(s)
    !(s =~ bracketed_email_regex || s =~unbracketed_email_regex).nil?
  end
end
так что тогда вы можете сделать это:
<code>
address_field.split(/\s*,\s*/).select {|addr| EmailValidator.valid_email?(addr)}
0 голосов
/ 10 августа 2009

Посмотрите на ActiveRecord :: Validations :: ClassMethods, в частности, метод validates_each.

http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M002161

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...