Ruby Imap分段获取

时间:2019-06-03 19:39:48

标签: ruby email imap multipart

我尝试使用Ruby IMAP库(“ net / imap”)来获取电子邮件。我收到带有html和纯文本的消息,但是我只需要纯文本...

我的代码是...

imap = Net::IMAP.new('XXX')

imap.authenticate('LOGIN', 'USER', "PASS") imap.examine('INBOX') 

imap.search(['UNSEEN']).each do |message_id| 

  body = imap.fetch(message_id,'BODY[TEXT]')[0].attr['BODY[TEXT]'] 

  puts body 

end

我在这里

  

-57887f32df9433962df2d01c44487353c74c0f6d2b9721d30fc189fadae2内容类型:text / plain; charset = UTF-8

     

摘要:XXX说明:XXX。

     

-57887f32df9433962df2d01c44487353c74c0f6d2b9721d30fc189fadae2-

但是我只需要

  

摘要:XXX说明:XXX。

我如何在不需要“邮件”的情况下获取它

致谢

1 个答案:

答案 0 :(得分:0)

最好在后续的fetch <msgno> body[<partnum>] imap请求中询问特定的零件号。这将返回实际的mime部分,而不仅仅是具有MIME编码的正文文本。

例如,我使用以下循环将消息检索到mime_parts(假设@imap是您已经建立的imap客户端):

  new_msgs = @imap.uid_search('UNSEEN')
  puts "Found #{new_msgs.size} new messages"
  new_msgs.each do |msg_uid|
    msgs = @imap.uid_fetch(msg_uid, ['BODY', 'FLAGS', 'ENVELOPE'])
    raise "unexpected number of messages, count=#{msgs.size}" if msgs.size > 1
    @imap.uid_store(msg_uid, '+FLAGS', [:Seen]).inspect
    msg = msgs.first
    body = msg.attr['BODY']
    if body.media_type.eql?('MULTIPART')
      mime_parts = []
      body.parts.each.with_index do |part, idx|
        body_part = "BODY[#{idx+1}]"
        fetch_part = @imap.uid_fetch(msg_uid, body_part)
        mime_parts << part.to_h.merge!({content: fetch_part.first.attr[body_part]})
      end
    else
      fetch_text = @imap.uid_fetch(msg_uid, 'BODY[TEXT]')
      mime_parts = [{
          media_type: 'TEXT', subtype: 'PLAIN',
          content: fetch_text.first.attr['BODY[TEXT]']
        }]
    end
  end

然后您可以遍历mime_parts并对它们进行任何操作。