如果 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>")
也没有帮助。
我已经解决了这个问题,没有使用 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 收件人进行了测试,并且按预期工作(至少在那里!)。