Ruby on Rails 7 邮件内嵌图片无法显示问题求助
问题
我有一个Ruby on Rails 7应用,在本地localhost:3000的开发环境中运行。我可以发送邮件,但希望在邮件中内嵌logo图片(而非可下载附件)。以下是我的代码:
class XYZMailer < ApplicationMailer def create_xyz_email(first, second) @first = first @second= second attachments.inline['logo.png'] = File.read(Rails.root.join('app', 'assets', 'images', 'logo.png')) mail(to: @second.user.email, subject: "New XYZ #{@first.title} for you") end end
我在HTML视图中尝试了多种写法,但均无效:
<%= image_tag attachments['logo.png'].url, alt: "logo", style: "text-align: center; max-width: 96px;" %> <img src="cid:logo.png" alt="logo" style="text-align: center; max-width: 96px;"> <%= image_tag attachments['logo.png'].url %> <img src="cid:logo.png" alt="XYZ Logo" style="text-align: center; max-width: 96px;"> <img src="data:image/png;base64,YourBase64EncodedImageHere" alt="logo" style="text-align: center; max-width: 96px;"> <img src="data:image/png;base64,<%= Base64.encode64(File.read('app/assets/images/logo.png')).gsub("\n", '') %>" alt="XYZLogo">
请问我该如何操作才能让图片在邮件中正常显示?
解决方案
1. 修正Mailer中图片读取的编码问题
当前用File.read读取图片可能因编码问题导致内嵌失败,需指定二进制模式读取:
attachments.inline['logo.png'] = File.read(Rails.root.join('app', 'assets', 'images', 'logo.png'), mode: 'rb')
mode: 'rb'确保以二进制格式读取图片文件,避免文本编码转换破坏图片数据。
2. 在ERB视图中使用正确的内嵌引用方式
在HTML邮件模板中,直接用cid:引用内嵌附件的文件名即可,可结合Rails的image_tag助手:
<%= image_tag "cid:logo.png", alt: "XYZ Logo", style: "text-align: center; max-width: 96px;" %>
或原生HTML写法:
<img src="cid:logo.png" alt="XYZ Logo" style="text-align: center; max-width: 96px;">
3. 确认开发环境邮件预览的兼容性
如果用letter_opener或letter_opener_web预览邮件,部分预览工具可能无法正确解析内嵌图片,建议直接发送到真实测试邮箱(如Gmail)验证。另外可显式指定邮件的content_type为multipart/related,确保邮件结构正确:
mail(to: @second.user.email, subject: "New XYZ #{@first.title} for you", content_type: "multipart/related")
4. 排查Asset Pipeline的影响
若logo图片经过Asset Pipeline编译,可改用Asset Pipeline的方法获取图片内容,避免路径或编译问题:
attachments.inline['logo.png'] = Rails.application.assets.find_asset('logo.png').to_s
内容的提问来源于stack exchange,提问作者Volkan
相关产品推荐
相关产品推荐

