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导致的内容截断问题。
操作步骤:
- 在邮件参数中新增图片作为内嵌附件,设置
disposition为inline,并指定唯一的content_id - 将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
相关产品推荐
相关产品推荐

