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

求助:Rails发送邮件时附件显示在邮件正文中

解决Rails ActionMailer附件显示在正文的问题

嘿,我之前在项目里也碰到过一模一样的问题,折腾了好一阵才搞定!你的问题根源出在手动设置content_type: 'multipart/mixed',打乱了ActionMailer自动构建多部分邮件的逻辑,导致附件被当成正文内容解析了。

问题分析

当你直接给ActionMailer::Base.mail指定content_type: 'multipart/mixed'时,ActionMailer没有正确初始化多部分邮件的容器结构,附件就被直接追加到了正文的part里,而不是作为独立的附件单元。再加上你设置了空的body,部分邮件客户端就会把附件内容显示在正文中。

修复方案

最简单的解决方法就是去掉手动指定的content_type,让ActionMailer自动处理邮件类型,同时给正文加一句简单的内容(避免部分客户端解析异常)。修改后的代码如下:

saved_file = Rails.root.join('db', 'fix_db', 'errors_in_address_table.csv')
mailer = ActionMailer::Base.mail(
  from: 'no-replay@test.com',
  to: 'test@test.com',
  subject: 'Errors in database',
  body: '请查看附件中的数据库错误信息' # 给正文添加基础内容,提升兼容性
)
mailer.attachments['errors_in_address_table.csv'] = { 
  mime_type: 'text/csv', 
  content: File.read(saved_file) 
}
mailer.deliver

额外说明

如果你确实需要手动控制邮件的multipart类型,也可以通过multipart: true参数让ActionMailer正确初始化结构,而不是直接指定content_type:

mailer = ActionMailer::Base.mail(
  from: 'no-replay@test.com',
  to: 'test@test.com',
  subject: 'Errors in database',
  body: '请查看附件',
  multipart: true # 让ActionMailer自动构建多部分邮件结构
)

这样处理后,邮件客户端就会正确识别附件,不会再把它显示在正文中啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:12:50