内联发送预编码图像数据

问题描述 投票:0回答:1

如果 base64 编码的图像包含在

img
标记中的 text/html MimeBodyPart 中,许多提供商/电子邮件客户端(包括 Gmail)根本不会显示该图像。

因此,我尝试将电子邮件拆分为多个部分,但是如果将其放入 image/jpeg MimeBodyPart 中,已经使用 Base64 编码的图像会被额外的编码过程所破坏。

将(相同!)编码数据放入 PreencodedMimeBodyPart 中看起来应该是解决方案,但随后无法发送消息:

发送消息失败 com.sun.mail.smtp.SMTPSendFailedException: 550 允许的最大行长度为 998 个八位字节,得到 73256

任何人都可以看到我缺少的内容或建议一种从 Base64 数据发送内联图像的方法吗?

各种尝试(如上所述)均未能让 Gmail 显示图像。

杂耍(添加和删除)标题,例如

.setDisposition("inline")
.setHeader("Content-Transfer-Encoding", "base64")
.addHeader("Content-ID","<image>")
也没有帮助。

jakarta-mail
1个回答
0
投票

我已经解决了这个问题,没有使用 PreencodedMimeBodyPart。在互联网上使用它的罕见例子看起来要么是完全错误的,要么是可怕而复杂的。

我发现有效的方法是使用 MimeBodyPart 并使用数据处理程序向其中添加内容,完成后解码 Base64 图像数据。这样,当自动编码完成时,它不会作用于已经进行 Base64 编码的数据

MimeBodyPart imgPart = new MimeBodyPart();
DataHandler dh = new DataHandler(Base64.decode(part2), imgType");
imgPart.setDataHandler(dh);
imgPart.setDisposition( MimeBodyPart.INLINE );
imgPart.addHeader("Content-ID", "<image>");

part2是图像的base64编码 imgType 是 image/jpeg、img/png 等适当的

html 中需要有一个匹配的 img src="cid:image" 标签,您希望图像出现在其中。现在已经通过 Gmail 收件人进行了测试,并且按预期工作(至少在那里!)。

© www.soinside.com 2019 - 2024. All rights reserved.