如何使用ruby的net/imap库阅读电子邮件的正文?

awe*_*son 14 ruby imap

也许我今天只是脑筋不好,但我突然无法弄清楚如何阅读带有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

PS虽然我确实在代码中引用了活动支持,但这是sans-rails,这意味着没有动作邮件

And*_*rew 25

抄袭@Bjer的回答,这是一个完整的解决方案,使用mailgem和gmail_xoauthgem使用OAuth2登录gmail并解析所有电子邮件:

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
Run Code Online (Sandbox Code Playgroud)


geo*_*ane 22

如果您只想要消息的正文内容,您可以使用:

body = imap.fetch(message_id,'BODY[TEXT]')[0].attr['BODY[TEXT]']
Run Code Online (Sandbox Code Playgroud)

IMAP API虽然有点深奥.如果您想处理整个消息,我建议使用TMail将其解析为更易于使用的格式:

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


小智 7

或者如果你在ruby 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 
Run Code Online (Sandbox Code Playgroud)