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

如何解决RoR API模式下ruby-mailgun发邮件时内容图片不显示问题

问题原因排查

1. 本地资源无法被外部访问(核心问题)

你当前development.rb中配置的asset_host和default_url_options均指向http://localhost:3000,这是本地开发环境的私有服务地址,Gmail作为外部服务完全无法访问该地址下的资源,因此所有指向本地地址的图片都无法正常加载。

注意:#{Rails.root}/lib/assets/images/header-logo.png属于你开发机器的本地磁盘绝对路径,运行在用户设备上的邮件客户端完全没有权限读取该路径下的文件,该写法不适用于邮件场景。

2. Rails API模式默认缺失资产处理能力

Rails API模式初始化时默认关闭了Sprockets资产管道组件,也没有预加载Action View的资产相关辅助方法:

  • image_tag、asset_url、image_url这类方法默认无法正常工作,生成的路径大概率不符合预期
  • 即便你手动开启了资产管道,本地开发环境生成的资产路径依然指向localhost,还是存在外部无法访问的问题

3. Gmail资源拦截规则影响

就算你将图片放到公网可访问的地址,也要符合Gmail的资源加载规则,否则依然会被拦截:

  • 不允许加载非HTTPS的资源,必须使用带有效SSL证书的公网地址
  • 资源不能设置访问权限校验,Gmail的代理爬虫需要能无鉴权直接访问到图片
可行解决方案

开发测试临时方案

直接将测试图片上传到支持公共读、带HTTPS的公网静态存储,模板中直接填写完整的公网资源地址作为img标签的src属性即可。

通用兼容方案(推荐)

使用CID内嵌附件的方式加载图片,不需要依赖外部资源地址,兼容性最高,且你已经确认附件可以正常发送:

  1. 在对应Mailer的方法中添加内联附件:
attachments.inline['header-logo.png'] = File.read(Rails.root.join('lib/assets/images/header-logo.png'))
  1. 邮件模板中直接引用附件的CID地址:
%img{:src => attachments['header-logo.png'].url}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:06:03