You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby on Rails使用IMAP无法获取邮件正文内容求助

如何用Ruby Net::IMAP获取邮件正文

嘿,这问题我熟!你现在的代码只拿到了邮件的信封信息(发件人、主题这些),正文内容并不在ENVELOPE变量里,得通过BODY相关的属性来提取。Net::IMAP处理邮件正文要考虑邮件的结构——有些是单部分纯文本,有些是多部分(比如同时有纯文本和HTML版本,还可能带附件),我给你整理了完整的解决方案:

完整示例代码

require 'net/imap'
require 'base64' # 如果邮件是base64编码的话需要这个

imap = Net::IMAP.new('mail.example.com')
imap.authenticate('LOGIN', 'joe_user', 'joes_password')
imap.examine('INBOX')

imap.search(["RECENT"]).each do |message_id|
  # 先获取信封和邮件结构信息
  msg_data = imap.fetch(message_id, ["ENVELOPE", "STRUCTURE"])[0]
  envelope = msg_data.attr["ENVELOPE"]
  body_structure = msg_data.attr["STRUCTURE"]

  # 打印发件人和主题(和你原来的代码一致)
  puts "#{envelope.from[0].name}: \t#{envelope.subject}"

  # 处理邮件正文
  if body_structure.is_a?(Net::IMAP::BodyTypeMultipart)
    # 多部分邮件:遍历所有部分,筛选出正文(排除附件)
    body_structure.parts.each do |part|
      # 跳过附件(附件的disposition是attachment)
      next unless part.disposition.nil?

      # 提取纯文本正文
      if part.type == 'text' && part.subtype == 'plain'
        body_content = imap.fetch(message_id, "BODY[#{part.part_number}]")[0].attr["BODY[#{part.part_number}]"]
        # 如果是base64编码就解码
        decoded_content = part.encoding == 'BASE64' ? Base64.decode64(body_content) : body_content
        puts "\n纯文本正文:\n#{decoded_content}"
      end

      # 提取HTML正文(如果需要的话)
      if part.type == 'text' && part.subtype == 'html'
        body_content = imap.fetch(message_id, "BODY[#{part.part_number}]")[0].attr["BODY[#{part.part_number}]"]
        decoded_content = part.encoding == 'BASE64' ? Base64.decode64(body_content) : body_content
        puts "\nHTML正文:\n#{decoded_content}"
      end
    end
  else
    # 单部分邮件:直接获取整个正文
    body_content = imap.fetch(message_id, "BODY[]")[0].attr["BODY[]"]
    decoded_content = body_structure.encoding == 'BASE64' ? Base64.decode64(body_content) : body_content
    puts "\n正文:\n#{decoded_content}"
  end

  puts "\n---分割线---\n"
end

# 别忘了登出和断开连接
imap.logout
imap.disconnect

关键知识点说明

  • STRUCTURE属性:用来判断邮件是单部分还是多部分,以及每个部分的类型(文本、附件等)、编码方式。
  • BODY[part_number]:针对多部分邮件,通过部分编号获取对应内容;单部分邮件用BODY[]获取全部内容。
  • 编码处理:很多邮件正文会用Base64编码,所以需要根据part.encoding判断是否要解码。
  • 排除附件:通过part.disposition判断是否是附件,避免把附件内容当成正文提取。

这样应该就能顺利拿到邮件正文啦!

内容的提问来源于stack exchange,提问作者Irwan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:36:38