2009-07-08 74 views
11

也许今天我脑子不好,但我突然无法弄清楚如何用ruby的net/imap库阅读电子邮件。我已经呆了好几个小时了。我在google中输入了几个“ruby imap read body”的变体,并且探索了很多网站。他们都有如何拉附件,同步电子邮件服务器,与Gmail等工作的例子...一些(如chilkat)实际上是共享软件库,为您做到这一点。我已经看过net/imap文档,虽然有几个例子可以完成除了阅读正文的所有内容。如何使用ruby的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护栏,使意味着没有行动的邮件

回答

20

如果你只是想只是邮件的正文内容,您可以使用:

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 
7

或者,如果你对红宝石1.9.x的TMail好像有问题
我“M使用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 
23

捎带关@博伊尔的答案,这里是一个使用mail宝石和宝石gmail_xoauth登录到使用的OAuth2 Gmail的一个完整的解决方案,并分析所有的邮件:

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 
+0

`mail` gem是否对`xoauth`有任何依赖关系,因为当我遵循你的代码时,它会抛出错误'unknown auth type - “XOAUTH2”`。我正在做`require'net/imap'`和`require mail`,然后你的代码 – Jashwant 2012-10-24 11:05:13

相关问题