10

電子メールでは、「from」または「to」フィールドに 1 つ以上のアドレスを含めることができるように見えます。各アドレスは、"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ライブラリはありますか?

4

3 に答える 3

17

はい、これには gem があります。それはメールと呼ばれます。

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
于 2012-08-29T22:41:23.697 に答える
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"}]
于 2012-08-29T22:38:51.183 に答える
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"] 

名前とメールアドレスを一致させたい場合は、別のものが必要になります。

また、メール アドレスに「<」または「>」が含まれていると機能しませんが、これは非常にまれです。

于 2012-08-30T00:48:34.293 に答える