2009-07-08 3 views
11

Vielleicht habe ich heute nur ein schlechtes Gehirn, aber ich kann plötzlich nicht herausfinden, wie man eine Email mit Rubys Netz-/IMAP-Bibliothek liest. Ich war mehrere Stunden dabei. Ich habe mehrere Varianten von "ruby imap read body" in Google eingegeben und viele Seiten erkundet. Alle von ihnen haben Beispiele zum Ziehen von Anlagen, zum Synchronisieren von E-Mail-Servern, zum Arbeiten mit Google Mail usw. Einige (wie Chilkat) sind tatsächlich Shareware-Bibliotheken, die das für Sie tun. Ich habe die Dokumentation von net/imap angeschaut und es gibt mehrere Beispiele dafür, alles zu tun, außer den Fließtext zu lesen.Wie lese ich den Nachrichtentext einer Email mit der net/imap-Bibliothek von ruby?

Ich habe schon mit net/imap gearbeitet, aber ich musste nur die Anhänge in einem Posteingang in ein Verzeichnis herunterziehen. Ich habe in #ruby und #rubyonrails vergebens gefragt - niemand konnte es herausfinden.

 

imap=Net::IMAP.new('mail.xks.com') #of course these are not real 
imap.login('web1_xk3','pxx2006') 
imap.select('INBOX') 
imap.search(["SENTSINCE",(Time.now-1.day).strftime("%d-%b-%Y")]).each do |msgid| 
    body = imap.fetch(msgid,"BODY")[0].attr["BODY"] 
    ##insert code for getting the text from the body here 
    ##body.class is BodyTypeText 
end 
 

P.S. Obwohl ich einen Hinweis auf eine aktive Unterstützung im Code machen tun, dann ist dies sans-Schienen, so dass bedeutet, dass keine Aktion Mailer

Antwort

20

Wenn Sie gerade nur den Körper Inhalt der Nachricht möchten, können Sie verwenden:

body = imap.fetch(message_id,'BODY[TEXT]')[0].attr['BODY[TEXT]'] 

Die IMAP-API ist jedoch ein wenig esoterisch. Wenn Sie mit der ganzen Nachricht beschäftigen möchten, würde ich mit TMail empfehlen es in eine leichter zu analysieren verwenden Format:

msg = imap.fetch(message_id,'RFC822')[0].attr['RFC822'] 
mail = TMail::Mail.parse(msg) 
body = mail.body 
7

Oder wenn Sie auf Rubin 1.9.x sind scheint TMail Probleme zu haben
I bin mit Post (https://github.com/mikel/mail)

body = imap.fetch(message_id,'BODY[TEXT]')[0].attr['BODY[TEXT]'] 
msg = imap.fetch(-1,'RFC822')[0].attr['RFC822'] 
mail = Mail.read_from_string msg 

body = mail.body 
from = mail.from 
23

@ Bjer Antwort Huckepack off, hier ist eine komplette Lösung, die mail Juwel und gmail_xoauth Juwel mit in gmail loggt OAuth2 mit und analysiert alle E-Mails:

imap = Net::IMAP.new('imap.gmail.com', 993, usessl = true, certs = nil, verify = false) 
imap.authenticate('XOAUTH2', '[email protected]', 'access_token_goes_here') 
imap.select('INBOX') 
imap.search(['ALL']).each do |message_id| 

    msg = imap.fetch(message_id,'RFC822')[0].attr['RFC822'] 
    mail = Mail.read_from_string msg 

    puts mail.subject 
    puts mail.text_part.body.to_s 
    puts mail.html_part.body.to_s 

end 
+0

Hat 'mail' gem eine Abhängigkeit für' xoauth', denn wenn ich Ihrem Code folge, wird der Fehler 'unknown auth type -" XOAUTH2 "' angezeigt. Ich mache 'require' net/imap'' und 'require mail' vor Ihrem Code – Jashwant

+1

ah, ja, tut mir leid. Um Googles XOAUTH2 nutzen zu können, benötigen Sie das ['gmail_xoauth'] (https://github.com/nfo/gmail_xoauth) Gem. – Andrew

+0

Oh, ich benutze dieses Plugin bereits, aber nachdem ich Ihren Post gesehen habe, dachte ich, dass dieses großartige Plugin mit tun, die XOAUTH2 Authentifizierung auch, so dass entfernt. Ich benutze beide jetzt. 'gmail_xoauth' für die Authentifizierung und' mail' für die bessere Verwaltung von Mails. Es funktioniert gut! – Jashwant