【问题标题】:How to read the body text of an email using ruby's net/imap library?如何使用 ruby​​ 的 net/imap 库读取电子邮件的正文?
【发布时间】: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

【问题讨论】:

    标签: ruby imap


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2021-05-07
        • 2023-03-18
        • 2012-06-27
        • 2013-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        相关资源
        最近更新 更多