[英]Parse email addresses for “from” and “to” fields in Ruby
在電子郵件中,看起來“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庫?
是的,這是一個寶石; 它被稱為郵件 。
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
假設您的數據遵循您提供的示例,這應該有效:
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"}]
我不知道圖書館,但如果您想獲得電子郵件列表,您可以自己完成以下操作。 (故意啰嗦)
@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"]
如果您想匹配他們的姓名和電子郵件地址,您將需要其他內容。
此外,如果電子郵件地址中有“<”或“>”,這將無效,但這種情況非常罕見。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.