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

Java通过SendGrid发送HTML邮件时Gmail不显示PNG图片如何解决?

问题根因

你当前HTML中使用的是相对路径emails/header_img.png,邮件客户端(包括Gmail)打开时无法解析相对路径对应的资源地址,自然无法加载图片显示空白。

可行解决方案

方案1:替换为公网可访问的绝对URL(操作最简单)

直接将HTML中img标签的src属性修改为带完整域名的公网可访问地址,示例:

<img src="https://你的正式业务域名/emails/header_img.png" width="600" alt="TESTEXAMPLE > ® | ComericA Bank ®" label="testexample_header" border="0" style="display: block; max-width: 600px; font-family: Arial, sans-serif; font-size: 14px; line-height: 16px; color: #000000;" class="em_full_img" />

注意事项:

  • 确保该URL无需登录、无访问权限限制,公网环境可直接访问
  • 不要使用临时域名、短链域名,避免被Gmail的图片代理拦截

方案2:使用SendGrid内嵌附件(CID)方式(兼容性最好)

该方式将图片作为邮件的内嵌附件加载,不需要依赖外部资源,兼容性覆盖Gmail、Outlook等所有主流邮箱,且不会出现base64导致的内容截断问题。
操作步骤:

  1. 在邮件参数中新增图片作为内嵌附件,设置disposition为inline,并指定唯一的content_id
  2. 将HTML中img标签的src属性改为cid:你设置的content_id

Java代码修改示例

在原有构造emailParams的逻辑中,新增添加内嵌附件的代码:

// 构造图片附件对象
Attachment headerImg = new Attachment();
// 读取本地图片文件转为base64编码的字符串
byte[] imgBytes = Files.readAllBytes(Paths.get("本地图片存储路径/emails/header_img.png"));
String base64Img = Base64.getEncoder().encodeToString(imgBytes);
headerImg.setContent(base64Img);
headerImg.setType("image/png");
headerImg.setFilename("header_img.png");
// 设置为内嵌附件
headerImg.setDisposition("inline");
// 设置唯一contentId,和HTML中配置对应
headerImg.setContentId("header_img_001");

// 将附件加入emailParams
List<Attachment> attachments = new ArrayList<>();
attachments.add(headerImg);
emailParams.setAttachments(attachments);

对应HTML修改示例:

<img src="cid:header_img_001" width="600" alt="TESTEXAMPLE > ® | ComericA Bank ®" label="testexample_header" border="0" style="display: block; max-width: 600px; font-family: Arial, sans-serif; font-size: 14px; line-height: 16px; color: #000000;" class="em_full_img" />
调试建议

可以先发送测试邮件到Gmail,右键点击空白图片区域选择「复制图片地址」,查看地址是否为预期的可访问路径,快速定位问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:57:02