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

