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
相关产品推荐
相关产品推荐

