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

时间:2012-08-29 22:10:37

标签: ruby parsing email

在电子邮件中,“from”或“to”字段可能包含一个或多个地址,每个地址可能类似于"john@test.com""John D Jr <john@test.com>"

因此,“from”字段可能如下所示:

"a@a.com"

"a@a.com, Bob Blue <b@b.com>"

"Abe Allen <a@a.com>, b@b.com"

"Abe Allen <a@a.com>, Bob Blue <b@b.com>"

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

等等。

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

3 个答案:

答案 0 :(得分:12)

是的,这是一个宝石;它被称为 mail

require 'mail'

addresses = []
raw_addresses = Mail::AddressList.new("Abe Allen <a@a.com>, Bob Blue <b@b.com>, 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

答案 1 :(得分:0)

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

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 <b@b.com>"                      
# => [{:user=>nil, :email=>"a@a.com"}, {:user=>"Bob Blue", :email=>"b@b.com"}]

extract_emails "Abe Allen <a@a.com>, b@b.com"                     
# => [{:user=>"Abe Allen", :email=>"a@a.com"}, {:user=>nil, :email=>"b@b.com"}]

extract_emails "Abe Allen <a@a.com>, Bob Blue <b@b.com>"          
# => [{:user=>"Abe Allen", :email=>"a@a.com"}, {:user=>"Bob Blue", :email=>"b@b.com"}]

extract_emails "Abe Allen <a@a.com>, Bob Blue <b@b.com>, c@c.com" 
# => [{:user=>"Abe Allen", :email=>"a@a.com"}, {:user=>"Bob Blue", :email=>"b@b.com"}, {:user=>nil, :email=>"c@c.com"}]

答案 2 :(得分:0)

我不知道图书馆,但如果您想要获取电子邮件列表,您可以自己完成以下操作。 (故意啰嗦)

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

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

此外,如果有'&lt;',这将无效或'&gt;'在电子邮件地址中,但这种情况非常罕见。