如何使用 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 库读取电子邮件的正文?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby从指定邮箱读取邮件(IMAP/POP3)

Ruby IMAP 库不解码邮件主题

c语言调用libzip库读zip文件

MT6701磁编码器使用指南,14Bit单圈绝对值,I2C stm32 HAL库读角度

MT6701磁编码器使用指南,14Bit单圈绝对值,I2C stm32 HAL库读角度,兼容AS5600

MT6701磁编码器使用指南,14Bit单圈绝对值,I2C stm32 HAL库读角度,兼容AS5600