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

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

您可以使用TMail :: Address模块​​validation电子邮件, 如下所示 。 可以使用validate方法添加自定义validation。

 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]+\.)+[az]{2,})\Z/i errors.add(:email_addresses, "are invalid due to #{email}") end end end 

有多种正则表达式解决方案可用于validation电子邮件地址。 有关详情,请参阅此页面 。

如果有人试图解析其中包含名称的地址列表(如电子邮件标题中所示),我发现这样做的最简单方法是:

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

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

我使用以下内容:

 module EmailValidator self.email_name_regex = '[\w.%+-]+'.freeze self.domain_head_regex = '(?:[A-Z0-9-]+.)+'.freeze self.domain_tld_regex = '(?:[AZ]{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 

module EmailValidator self.email_name_regex = '[\w.%+-]+'.freeze self.domain_head_regex = '(?:[A-Z0-9-]+.)+'.freeze self.domain_tld_regex = '(?:[AZ]{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?
结束
结束
所以你可以这样做:

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

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

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

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