Parse email addresses for "from" and "to" fields in Ruby
Yes, there's a gem for this; it's called 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
Assuming your data follows the examples you gave, this should work:
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 endendextract_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"}]
I don't know of a library, but if you are trying to get a list of the emails you could do the following yourself. (Long winded on purpose)
@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"]
If you want to match their names and email addresses, you will need something else.
Also, this won't work if there are '<' or '>' in the email address, but that's pretty uncommon.