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

如何在Micronaut的HTML邮件中实现内嵌图片(Content Id方式)?

解决Micronaut邮件内嵌图片(Content Id方式)不生效问题

我用Micronaut开发Web应用,需要发送基于Velocity模板的邮件,要求在HTML主体中内嵌图片。评估三种实现方式后:

  • Base64编码图片:多数邮件客户端不支持,排除
  • 全局URL链接:目标图片不公开可访问,排除
  • Content Id附件:尝试后失败,图片仅作为普通附件存在,HTML中仅显示图片替代文本

原有代码片段

Java代码

Map<String, String> modelMap = new HashMap<>();
modelMap.put("xyz", "aaaaaaa");
TemplateBody<Map<String, String>> body =
    new TemplateBody<>("mail/mail-body.vm", modelMap);

byte[] image = IOUtils.resourceToByteArray("logo.png", getClass().getClassLoader());
Attachment logoAttachment = Attachment.builder()
    .id("logo")
    .filename("something.png")
    .contentType(MediaType.IMAGE_PNG)
    .content(image)
    .build();

Email.Builder emailBuilder = Email.builder()
    .from(sender)
    .to(recipient)
    .subject("some-subject")
    .body(body)
    .attachment(createLogoAttachment());

emailSender.send(emailBuilder);

Velocity HTML模板

<div>
    <p>
        Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed 
    </p>
    <p>
         do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad
    </p>
    <p>
        minim veniam
    </p>
    <p>
        quis nostrud exercitation ullamco laboris nisi ut - ${xyz}
    </p>
    <img src="cid:logo" alt="this is logo image"/>
</div>

原始邮件内容(关键部分)

------=_Part_0_2107679308.1690376383642
Content-Type: image/png; name=something.png
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=something.png

iVBORw0KGgoAAAANSUhEUgAABCkAAAFkCAYAAAANCGFyAAAAAXNSR0IArs4c6QAAAARnQU1BAACx ... 

问题原因与解决方案

从原始邮件内容可见,图片附件的Content-Disposition被设置为attachment,这会让邮件客户端将其识别为普通附件,而非内嵌资源。需要修改两个关键点:

  1. 设置Attachment的Content-Disposition为INLINE
    修改Attachment构建代码,添加disposition(ContentDisposition.INLINE)标记这是内嵌资源:
Attachment logoAttachment = Attachment.builder()
    .id("logo")
    .filename("something.png")
    .contentType(MediaType.IMAGE_PNG)
    .content(image)
    .disposition(ContentDisposition.INLINE) // 关键设置
    .build();
  1. 确保邮件构建时使用正确的Attachment对象
    原代码中emailBuilder.attachment(createLogoAttachment())可能创建了新的附件实例,需替换为上面构建好的logoAttachment:
Email.Builder emailBuilder = Email.builder()
    .from(sender)
    .to(recipient)
    .subject("some-subject")
    .body(body)
    .attachment(logoAttachment);

验证修改后的效果

修改后,邮件中图片附件的Content-Disposition会变为inline,同时会自动添加Content-ID: <logo>头部,邮件客户端就能通过cid:logo正确关联并显示内嵌图片。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 10:27:07