【发布时间】:2014-04-16 14:31:30
【问题描述】:
我想使用 Java Mail API (javax.mail) 发送一封电子邮件。消息必须包含 html,并且里面有对图像的引用。这是一个挑战,因为不允许引用磁盘上的物理文件,但我为该图像创建了一个 base64 字符串 (http://www.base64-image.de/step-1.php) 并将该数据复制到静态字符串变量。
使用 javax.mail 我构建了一个包含两部分的 MulitPart 类型的消息。第一部分是 html 本身,第二部分是图像。 html部分通过<img src="cid:image-id"/>.引用图片
Message msg = new MimeMessage(session);
Multipart multipart = new MimeMultipart("related");
BodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent("<html><body><h2>A title</h2>Some text in here<br/>" +
"<img src=\"cid:the-img-1\"/><br/> some more text<img src=\"cid:the-img-1\"/></body></html>", "text/html");
multipart.addBodyPart(htmlPart);
public static final String base64logo = "/9j/4AAQSkZJRgABAQEASABIAAD/4QBe…"; // ein ganz langer String erzeugt über http://www.base64-image.de/step-1.php
sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();
byte[] imageByte = decoder.decodeBuffer(base64logo);
InternetHeaders header = new InternetHeaders();
BodyPart imgPart=new MimeBodyPart(header, imageByte);
imgPart.setHeader("Content-ID","the-img-1");
imgPart.setDisposition(MimeBodyPart.INLINE);
multipart.addBodyPart(imgPart);
msg.setContent(multipart);
很遗憾,收到的电子邮件中缺少图片。
当我指向磁盘上的文件时,它正在工作:
DataSource ds=new FileDataSource("c:/temp/image001.jpg");
imgPart.setDataHandler(new DataHandler(ds));
我们正在与 Talend 一起开发,我们无法参考 到外部文件,因为这会使部署过程 更复杂。
你能在我的方法中找到一些错误的做法吗?
亲切的问候 希尔德里希
【问题讨论】:
-
一般做法是正确的。我怀疑图像参考有问题。查看您发送的邮件的完整来源。图片应该在那里,检查您引用它的 id 是否正确。
-
谢谢!但是参考 (Content-ID) 拼写正确。
-
我也遇到了同样的问题,请问有解决办法吗?
标签: java jakarta-mail