15

也许我今天脑子不好,但我突然不知道如何用 ruby​​ 的 net/imap 库阅读电子邮件。我已经做了几个小时了。我在谷歌中输入了几种“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 所以这意味着没有 action-mailer

4

3 回答 3

26

捎带@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
于 2012-10-11T23:10:30.983 回答
23

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

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
于 2009-07-09T02:01:42.290 回答
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 
于 2012-05-26T08:52:25.370 回答