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

