Я хотел бы отправить электронное письмо с помощью Java Mail API (javax.mail). Сообщение должно содержать html и внутри есть ссылка на изображение. Существует проблема, потому что никакая ссылка на физический файл на диске не разрешена, но вместо этого я создал строку base64 (http://www.base64-image.de/step-1.php) для этого изображения и скопировал эти данные к статической переменной String. С 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
Попробуйте поставить угловые скобки здесь
imgPart.setHeader("Content-ID","<the-img-1>");
Я нашел этот ответ на комментариях старого сообщения из этого блога
http://www.jroller.com/eyallupu/entry/javamail_sending_embedded_image_in
В комментарии Аравинда Велаядхана Наира
Это сработало для меня!
Об этом уже давно спрашивали. Но я отвечу на это, поскольку я столкнулся с той же проблемой, исходя из моего собственного ответа здесь.
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);
Надеюсь, это поможет кому-то.