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

时间:2009-07-08 23:33:50

标签: 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

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

3 个答案:

答案 0 :(得分:25)

撇开@Bjer的答案,这是一个完整的解决方案,使用mail gem和gmail_xoauth gem使用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

答案 1 :(得分:22)

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

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

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

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

答案 2 :(得分: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