2012-08-29 2 views
6

In einer E-Mail, es sieht aus wie ein „von“ oder „nach“ Feld einer oder mehr Adressen enthalten kann, kann jede Adresse sein wie "[email protected]" oder "John D Jr <[email protected]>"Parst E-Mail-Adressen für „von“ und „bis“ Felder in Ruby

so ein "von" Feld kann wie eine der folgenden aussehen:

"[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]" 

und so weiter.

Ich möchte diese Felder analysieren, extrahieren die E-Mail-Adresse jeder Adresse, wenn es gültig ist, und den Namen, wenn es vorhanden ist. Da ich mit dem E-Mail-Standard nicht vertraut bin, fehlen mir möglicherweise einige Fälle, in denen Adressfelder aussehen können. Gibt es eine Ruby-Bibliothek, die das kann?

+1

Parsing und Validierung von E-Mail-Adressen ist keine triviale Aufgabe. Die Auswahl an Formaten ist riesig und selbst wenn eine Adresse gültig ist, ist es leicht möglich, dass sie gefälscht ist und keine Lieferadresse ist. Siehe "[Ich wusste, wie man eine E-Mail-Adresse validiert, bis ich den RFC gelesen habe]" (http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address- bis-i.aspx) "für einen interessanten Artikel über das Thema. Auch [Wikipedia Artikel] (http://en.wikipedia.org/wiki/Email_address) und [der SMTP RFC] (http://tools.ietf.org/html/rfc5322) selbst. –

Antwort

11

Ja, es ist ein Juwel für diese; Es heißt mail.

+1

Danke, das funktioniert gut für meinen Anwendungsfall. Übrigens, ich glaube, du wolltest "rohe_addresses.addresses.each"? – foobar

+0

Yup, danke. – deefour

0

Angenommen, Ihre Daten folgt die Beispiele, die Sie gaben, sollte diese Arbeit:

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 sagte: "Ich bin nicht vertraut mit dem E-Mail-Standard, möglicherweise fehlen einige Fälle, wie Adressfelder aussehen können." ... –

+0

Sicher, aber wenn seine E-Mails oder Benutzernamen "<" and ">" enthalten, wird dies funktionieren gut mit allen Daten. Wenn sie diese enthalten können, dann muss er im Grunde einen Parser schreiben. –

0

Ich kenne keine Bibliothek, aber wenn Sie versuchen, eine Liste der E-Mails zu erhalten, können Sie selbst folgendes tun. (Langsam mit Absicht aufgewickelt)

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

Wenn Sie ihre Namen und E-Mail-Adressen vergleichen möchten, benötigen Sie etwas anderes.

Auch das wird nicht funktionieren, wenn es "<" oder ">" in der E-Mail-Adresse gibt, aber das ist ziemlich ungewöhnlich.

Verwandte Themen