Как прочитать основной текст электронной почты с использованием библиотеки ruby net/imap?
Возможно, сегодня у меня плохой мозг, но я не могу понять, как читать электронную почту с помощью библиотеки ruby net/imap. Я был на нем несколько часов. Я набрал несколько вариантов "ruby imap read body" в google и исследовал многие сайты. Все они имеют примеры того, как вытаскивать вложения, синхронизировать серверы электронной почты, работать с 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
Ответы
Ответ 1
Если вам просто нужно только содержимое тела сообщения, которое вы можете использовать:
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
Ответ 2
Вывод из ответа @Bjer, здесь полное решение с использованием mail
gem и gmail_xoauth
gem для входа в gmail с использованием OAuth2 и анализа всех писем:
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
Ответ 3
Или, если вы на рубине 1.9.x У TMail, похоже, есть проблемы
Я использую Mail (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
Ответ 4
Мне нужно HTML и текстовое содержимое отдельно от основной почты
но я не могу использовать камень "почта"
Может ли кто-нибудь помочь мне?