解析Ruby中“from”和“to”字段的电子邮件地址

在电子邮件中,看起来“from”或“to”字段可以包含一个或多个地址,每个地址可以像"john@test.com""John D Jr "

因此,“from”字段可能看起来像以下任何一种:

 "a@a.com" "a@a.com, Bob Blue " "Abe Allen , b@b.com" "Abe Allen , Bob Blue " "Abe Allen , Bob Blue , c@c.com" 

等等。

我想分析这些领域中,提取每个地址的电子邮件,如果它是有效的,而名称,如果它的存在。 由于我不熟悉电子邮件标准,我可能会遗漏一些地址字段的情况。 是否有可以执行此操作的Ruby库?

是的,这是一个gem; 它被称为邮件

 require 'mail' addresses = [] raw_addresses = Mail::AddressList.new("Abe Allen , Bob Blue , c@c.com") raw_addresses.addresses.each do |a| address = {} address[:address] = a.address address[:name] = a.display_name if a.display_name.present? addresses << address end 

假设您的数据遵循您提供的示例,这应该有效:

 def extract_emails(string) string.split(', ').map do |user_string| if user_string.include? '<' user_string =~ /^([^<]*)<([^>]*)>$/ {user: $1.strip, email: $2} else {user: nil, email: user_string} end end end extract_emails "a@a.com" # => [{:user=>nil, :email=>"a@a.com"}] extract_emails "a@a.com, Bob Blue " # => [{:user=>nil, :email=>"a@a.com"}, {:user=>"Bob Blue", :email=>"b@b.com"}] extract_emails "Abe Allen , b@b.com" # => [{:user=>"Abe Allen", :email=>"a@a.com"}, {:user=>nil, :email=>"b@b.com"}] extract_emails "Abe Allen , Bob Blue " # => [{:user=>"Abe Allen", :email=>"a@a.com"}, {:user=>"Bob Blue", :email=>"b@b.com"}] extract_emails "Abe Allen , Bob Blue , c@c.com" # => [{:user=>"Abe Allen", :email=>"a@a.com"}, {:user=>"Bob Blue", :email=>"b@b.com"}, {:user=>nil, :email=>"c@c.com"}] 

我不知道一个库,但如果你试图让你可以做到以下几点自己的电子邮件列表。 (故意啰嗦)

 @a = "Abe Allen , Bob Blue , c@c.com" b = @a.split(',') #=> ["Abe Allen ", " Bob Blue ", " c@c.com"] c = b.collect{|x| x[/<(.*?)>|^([^<>]*)$/]} #=> ["", "", " c@c.com"] d = c.gsub(/[<>]/,'') #=> ["a@a.com", "b@b.com", " c@c.com"] 

如果您想匹配他们的姓名和电子邮件地址,您将需要其他内容。

此外,如果电子邮件地址中有“<”或“>”,这将无效,但这种情况非常罕见。