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

如何在Rails中用Net::IMAP和Mail展示纯邮件正文?

Ruby Mail Gem 纯内容提取方案

你遇到的问题是因为直接调用mail.body.to_s会返回整个MIME部分的原始数据(包括头部),而Mail gem提供了专门的方法来提取解码后的纯内容:

通用纯文本提取代码

# @imap is instance of Net::IMAP
mail = @imap.fetch(seqno, "RFC822")[0]
mail = Mail.read_from_string(mail.attr["RFC822"])

# 提取纯文本内容
plain_content = if mail.multipart?
  # 多部分邮件优先取纯文本部分并解码
  mail.text_part&.body&.decoded
else
  # 单部分邮件直接解码内容
  mail.body.decoded
end

# 确保编码正确(处理乱码问题)
plain_content = plain_content.force_encoding('UTF-8').scrub if plain_content

为什么之前的方法不行?

mail.body返回的是Mail::Body对象,它包含了当前MIME部分的所有数据(包括Content-Type、Transfer-Encoding这些头部),to_s会直接输出原始的MIME块内容。而decoded方法会自动处理quoted-printable或base64编码,剥离头部,只返回邮件的实际内容。

支持HTML的展示方案

如果需要展示富文本内容,可以同时提取HTML部分作为备选:

if mail.multipart?
  html_content = mail.html_part&.body&.decoded
  plain_content = mail.text_part&.body&.decoded
else
  if mail.content_type =~ /text\/html/
    html_content = mail.body.decoded
  else
    plain_content = mail.body.decoded
  end
end

# 实际展示时可以优先用HTML,没有则用纯文本
display_content = html_content || plain_content

关于文档

Mail gem的官方文档里对text_part、html_part和decoded方法有详细说明,核心就是通过这些方法来区分不同类型的邮件内容,避免直接操作原始的body数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:42:05