如何验证模型中的多个电子邮件地址?

时间:2009-08-10 14:13:15

标签: ruby-on-rails ruby

例如:逗号分隔在单个文本字段中: mail1 @ domain.com,mail2 @ someotherdomain,...

4 个答案:

答案 0 :(得分:6)

您可以使用TMail :: Address模块​​将电子邮件验证为shown here。可以使用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

有多种正则表达式解决方案可用于验证电子邮件地址。请参阅this page for details

答案 1 :(得分:2)

如果有人试图解析其中包含姓名的地址列表,可能会出现在电子邮件标题中,我发现这样做的最简单方法是:

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

header.addrs将包含一组TMail::Address个对象,您可以访问这些对象的名称,电子邮件地址,域等。

答案 2 :(得分:1)

我使用以下内容:


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.<\s(#{email_name_regex}@#{domain_head_regex}#{domain_tld_regex})\s*>.\z/i
  self.unbracketed_email_regex = /\A\s(#{email_name_regex}@#{domain_head_regex}#{domain_tld_regex})\s*\z/i

def self.valid_email?(s) !(s =~ bracketed_email_regex || s =~unbracketed_email_regex).nil? end end

所以你可以这样做:

address_field.split(/\s*,\s*/).select {|addr| EmailValidator.valid_email?(addr)}

答案 3 :(得分:0)

查看ActiveRecord :: Validations :: ClassMethods,特别是validates_each方法。

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

这将允许您将属性作为块传递,然后您可以编写自己的验证方法,该方法将拆分字符串并将每个电子邮件地址验证为正则表达式。