2012-08-29 4 views
6

In un'email, sembra una "da" o "a" campo può contenere uno o più indirizzi, ogni indirizzo può essere come "[email protected]" o "John D Jr <[email protected]>"Parse indirizzi e-mail per "da" e "per" i campi in Ruby

quindi un campo "da" può apparire come una delle seguenti:

"[email protected]" 

"[email protected], Bob Blue <[email protected]>" 

"Abe Allen <[email protected]>, [email protected]" 

"Abe Allen <[email protected]>, Bob Blue <[email protected]>" 

"Abe Allen <[email protected]>, Bob Blue <[email protected]>, [email protected]" 

e così via.

Voglio analizzare questi campi, estraendo l'e-mail di ciascun indirizzo se è valida e il nome se è presente. Poiché non ho familiarità con lo standard email, potrei mancare alcuni casi in cui i campi degli indirizzi possono essere visualizzati. C'è una libreria Ruby in grado di fare questo?

+1

L'analisi e la convalida degli indirizzi di posta elettronica non è un'operazione banale. La gamma di formati è enorme e, anche se un indirizzo è valido, è facilmente possibile che sia falso e non un indirizzo consegnabile. Vedi "[Ho saputo come convalidare un indirizzo e-mail prima di aver letto la RFC] (http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-ad-ress- until-i.aspx) "per un interessante articolo sull'argomento. Anche [articolo di Wikipedia] (http://en.wikipedia.org/wiki/Email_address) e [RFC SMTP] (http://tools.ietf.org/html/rfc5322) stesso. –

risposta

11

Sì, c'è una gemma per questo; si chiama mail.

require 'mail' 

addresses = [] 
raw_addresses = Mail::AddressList.new("Abe Allen <[email protected]>, Bob Blue <[email protected]>, [email protected]") 

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

Grazie, questo funziona bene per il mio caso d'uso. A proposito, penso che intendevi fare "raw_addresses.addresses.each"? – foobar

+0

Sì, grazie. – deefour

0

Supponendo che i dati segue gli esempi hai dato, questo dovrebbe funzionare:

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 "[email protected]"           
# => [{:user=>nil, :email=>"[email protected]"}] 

extract_emails "[email protected], Bob Blue <[email protected]>"      
# => [{:user=>nil, :email=>"[email protected]"}, {:user=>"Bob Blue", :email=>"[email protected]"}] 

extract_emails "Abe Allen <[email protected]>, [email protected]"      
# => [{:user=>"Abe Allen", :email=>"[email protected]"}, {:user=>nil, :email=>"[email protected]"}] 

extract_emails "Abe Allen <[email protected]>, Bob Blue <[email protected]>"   
# => [{:user=>"Abe Allen", :email=>"[email protected]"}, {:user=>"Bob Blue", :email=>"[email protected]"}] 

extract_emails "Abe Allen <[email protected]>, Bob Blue <[email protected]>, [email protected]" 
# => [{:user=>"Abe Allen", :email=>"[email protected]"}, {:user=>"Bob Blue", :email=>"[email protected]"}, {:user=>nil, :email=>"[email protected]"}] 
+0

OP ha detto "Non ho familiarità con lo standard di posta elettronica, potrei mancare alcuni casi di quali campi indirizzo possono essere simili." ... –

+0

Certo, ma a meno che le sue e-mail o nomi utente includano "<" and ">", questo funzionerà bene con tutti i dati. Se possono includerli, allora basterà scrivere un parser. –

0

non so di una libreria, ma se si sta cercando di ottenere un elenco dei messaggi di posta elettronica che si potrebbe fare la seguente soli. (A carica continua apposta)

Se si desidera abbinare i propri nomi e indirizzi e-mail, è necessario qualcos'altro.

Inoltre, questo non funzionerà se ci sono "<" o ">" nell'indirizzo di posta elettronica, ma è piuttosto raro.

Problemi correlati