我想发送一封包含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
答案 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);
希望它会对某人有所帮助。