例如:逗号分隔在单个文本字段中: mail1 @ domain.com,mail2 @ someotherdomain,...
答案 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
这将允许您将属性作为块传递,然后您可以编写自己的验证方法,该方法将拆分字符串并将每个电子邮件地址验证为正则表达式。