如何在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,这会让邮件客户端将其识别为普通附件,而非内嵌资源。需要修改两个关键点:
- 设置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();
- 确保邮件构建时使用正确的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
相关产品推荐
相关产品推荐

