Ruby Imap多段式获取

问题描述 投票:0回答:1

我试图使用Ruby IMAP库("netimap")来获取邮件。我得到的邮件有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内容类型:textplain;charset=UTF-8。

摘要:XXX描述。XXX。

--57887f32df9433962df2d01c44487353c74c0f6d2b9721d30fc189fadae2--。

但我只需要

摘要:XXX描述。XXX.

我怎么能不需要 "邮件 "就能得到呢?

祝贺

ruby email imap multipart
1个回答
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上迭代,然后做任何你想做的事情。

© www.soinside.com 2019 - 2024. All rights reserved.