html电子邮件,引用图像为base64字符串

时间:2014-03-12 12:38:32

标签: java javax.mail

我想发送一封包含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一起开发,我们无法参考 到外部文件,因为这将进行部署过程 更复杂。

你能在我的方法中找到一些错误的行为吗?

亲切的问候 Hilderich

2 个答案:

答案 0 :(得分:1)

尝试在这里添加角度支撑

imgPart.setHeader("Content-ID","<the-img-1>");

我在这个博客的一篇旧帖子的评论中找到了这个答案

http://www.jroller.com/eyallupu/entry/javamail_sending_embedded_image_in

Aravind Velayudhan Nair的评论

它对我有用!

答案 1 :(得分:0)

很久以前就有人问过这个问题。但我会回答这个问题,因为我从自己的回答here中遇到了同样的问题。

byte[] tile = DatatypeConverter.parseBase64Binary(base64logo);
BodyPart messageBodyPart = new MimeBodyPart();
DataHandler dataHandler = new DataHandler(new ByteArrayDataSource(tile, "image/jpeg"));
messageBodyPart.setDataHandler(dataHandler);
messageBodyPart.setHeader("Content-ID", "<the-img-1>");
multipart.addBodyPart(messageBodyPart);
msg.setContent(multipart);

希望它会对某人有所帮助。