Ruby Imap多部分提取

gkl3eglg  于 2022-11-29  发布在  Ruby
关注(0)|答案(1)|浏览(121)

我试着使用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

在这里我得到
内容类型:文本/纯文本;字符集=UTF-8
概要:XXX描述:第三十条.


但我只需要
概要:XXX描述:第三十条.
不需要“邮件”我怎么能拿到呢

djmepvbi

djmepvbi1#

您最好在后续的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并对它们执行任何您喜欢的操作。

相关问题