Как прочитать основной текст письма, используя библиотеку ruby's net / imap? - PullRequest
13 голосов
/ 09 июля 2009

Возможно, у меня сегодня просто плохой ум, но я вдруг не могу понять, как читать электронную почту с помощью библиотеки ruby ​​net / imap. Я был на этом в течение нескольких часов. Я набрал в Google несколько вариантов «ruby imap read body» и исследовал множество сайтов. У всех них есть примеры того, как извлекать вложения, синхронизировать почтовые серверы, работать с gmail и т. Д. Некоторые (например, chilkat) на самом деле являются условно-бесплатными библиотеками, которые делают это для вас. Я посмотрел на документацию по net / imap и хотя есть несколько примеров для всего, кроме чтения основного текста.

Раньше я работал с net / imap, но мне нужно было только вытащить вложения из папки «Входящие» в каталог. Я спросил в #ruby и #rubyonrails безрезультатно - никто не мог понять это.


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. Хотя я делаю ссылку на активную поддержку в коде, это sans-rails, так что это означает отсутствие action-mailer

Ответы [ 3 ]

25 голосов
/ 12 октября 2012

Взаимодействие с ответом @ Bjer, вот полное решение с использованием гема mail и gmail_xoauth для входа в gmail с использованием OAuth2 и анализа всех писем:

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
22 голосов
/ 09 июля 2009

Если вы хотите использовать только текст сообщения, вы можете использовать:

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

API IMAP немного эзотеричен. Если вы хотите разобраться со всем сообщением, я бы рекомендовал использовать TMail , чтобы разобрать его в более простой в использовании формат:

msg = imap.fetch(message_id,'RFC822')[0].attr['RFC822']
mail = TMail::Mail.parse(msg)
body = mail.body
7 голосов
/ 26 мая 2012

Или если вы на ruby ​​1.9.x У TMail, похоже, проблемы
Я пользуюсь почтой (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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...