如何使用 ruby 的 net/imap 库读取电子邮件的正文?
Posted
技术标签:
【中文标题】如何使用 ruby 的 net/imap 库读取电子邮件的正文?【英文标题】:How to read the body text of an email using ruby's net/imap library? 【发布时间】:2010-11-09 05:20:23 【问题描述】:也许我今天脑子不好,但我突然不知道如何使用 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
附:虽然我确实在代码中提到了主动支持,但这是 sans-rails 所以这意味着没有 action-mailer
【问题讨论】:
【参考方案1】:借鉴@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
【讨论】:
mail
gem 是否对 xoauth
有任何依赖关系,因为当我按照您的代码进行操作时,它会抛出错误 unknown auth type - "XOAUTH2"
。我在你的代码之前做require 'net/imap'
和require mail
啊,是的,很抱歉。要使用 Google 的 XOAUTH2,您需要 gmail_xoauth
gem
哦,我已经在使用那个插件了,但是看到你的帖子后,我认为这个很棒的插件也做了 XOAUTH2 身份验证,所以删除了它。我现在两个都用。 gmail_xoauth
用于身份验证,mail
用于更好地管理邮件。它工作正常!
另外,如果你想尝试使用谷歌,here's an example of using omniauth to get the access token
是否有与 RFC822 等效的不同属性可以在不获取整个 RFC822 的情况下进行正文提取?当有大附件时,它会变得非常慢。【参考方案2】:
或者,如果您使用的是 ruby 1.9.x,TMail 似乎有问题 我正在使用邮件 (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
【讨论】:
【参考方案3】:如果您只想要消息的正文内容,您可以使用:
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
【讨论】:
以上是关于如何使用 ruby 的 net/imap 库读取电子邮件的正文?的主要内容,如果未能解决你的问题,请参考以下文章
MT6701磁编码器使用指南,14Bit单圈绝对值,I2C stm32 HAL库读角度