Comment lire le corps du texte d'un courrier électronique en utilisant la bibliothèque nette / imap rubis?

StackOverflow https://stackoverflow.com/questions/1101101

  •  12-09-2019
  •  | 
  •  

Question

Peut-être que je viens de recevoir un mauvais cerveau aujourd'hui, mais je ne peux pas soudainement comprendre comment lire un e-mail avec un filet / bibliothèque imap de rubis. Je suis à elle pendant plusieurs heures. Je tapais plusieurs variantes de « imap rubis corps lire » dans google et ont exploré de nombreux sites. Ils ont tous des exemples sur la façon de tirer les pièces jointes, les serveurs de messagerie de synchronisation, le travail avec gmail etc ... Certains (comme chilkat) sont en fait des bibliothèques shareware qui font cela pour vous. Je l'ai regardé la documentation nette / imap et bien qu'il existe plusieurs exemples pour tout faire mais en lisant le texte du corps.

J'ai travaillé avec net / imap avant, mais je ne l'ai besoin pour tirer vers le bas les pièces jointes dans une boîte de réception dans un répertoire. J'ai demandé à #ruby et #rubyonrails en vain - personne ne pouvait comprendre.


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. Bien que je fais référence à un soutien actif dans le code, cela est sans rails ce qui signifie aucune action-mailer

Était-ce utile?

La solution

Si vous voulez juste que le contenu du corps du message que vous pouvez utiliser:

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

L'API IMAP est un peu ésotérique cependant. Si vous voulez traiter l'ensemble du message, je vous conseille d'utiliser tmail pour analyser dans un moyen plus facile d'utiliser le format :

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

Autres conseils

Ferroutage off @ réponse de Bjer, voici une solution complète en utilisant la mail et bijou gmail_xoauth petit bijou de se connecter à l'aide gmail OAuth2 et parse tous les e-mails:

imap = Net::IMAP.new('imap.gmail.com', 993, usessl = true, certs = nil, verify = false)
imap.authenticate('XOAUTH2', 'example@gmail.com', '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

Ou si vous êtes sur 1.9.x rubis tmail semble avoir des problèmes
J'utilise Courrier ( 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 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top