Ваша проблема
Насколько я вижу, похоже, что вы создаете сообщение, и все в основном правильно! Вы используете правильные типы MIME и все.
Я не уверен, почему вы используете DataSource и DataHandler, и у вас есть ContentID на изображении, но вам нужно заполнить свой вопрос, чтобы я мог больше устранять неполадки. Особенно, следующая строка:
bodyPart.setContent(message, "text/html; charset=ISO-8859-1");
Что находится в message
? Содержит ли оно <img src="cid:image" />
?
Вы пытались сгенерировать ContentID с String cid = ContentIdGenerator.getContentId();
вместо использования image
Источник
Эта статья в блоге научила меня, как использовать правильный тип сообщения, прикрепить мое изображение и обратиться к вложению из тела HTML: Как отправлять электронную почту со встроенными изображениями с использованием Java
Подробнее
Сообщение
Вы должны создать свой контент, используя класс MimeMultipart
. Важно использовать строку "related"
в качестве параметра для конструктора, чтобы сообщить JavaMail, что ваши части "работают вместе" .
MimeMultipart content = new MimeMultipart("related");
Идентификатор контента
Вам необходимо сгенерировать ContentID, это строка, используемая для идентификации изображения, которое вы прикрепили к своей электронной почте, и ссылки на него в теле письма.
String cid = ContentIdGenerator.getContentId();
Примечание. Этот класс ContentIdGenerator
является гипотетическим. Вы можете создать один или встроить создание идентификаторов контента. В моем случае я использую простой метод:
import java.util.UUID;
// ...
String generateContentId(String prefix) {
return String.format("%s-%s", prefix, UUID.randomUUID());
}
HTML body
HTML-код является частью содержимого MimeMultipart
. Для этого используйте класс MimeBodyPart
. Не забудьте указать encoding
и "html"
при настройке текста этой части!
MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setText(""
+ "<html>"
+ " <body>"
+ " <p>Here is my image:</p>"
+ " <img src=\"cid:" + cid + "\" />"
+ " </body>"
+ "</html>"
,"US-ASCII", "html");
content.addBodyPart(htmlPart);
Обратите внимание, что в качестве источника изображения мы используем cid:
и сгенерированный ContentID.
Вложение изображения
Мы можем создать еще один MimeBodyPart
для прикрепления изображения.
MimeBodyPart imagePart = new MimeBodyPart();
imagePart.attachFile("resources/teapot.jpg");
imagePart.setContentID("<" + cid + ">");
imagePart.setDisposition(MimeBodyPart.INLINE);
content.addBodyPart(imagePart);
Обратите внимание, что мы используем один и тот же ContentID между <
и >
и устанавливаем его в качестве ContentID изображения. Мы также установили расположение на INLINE
, чтобы сигнализировать, что это изображение предназначено для отображения в электронном письме, а не в качестве вложения.
Завершить сообщение
Вот и все! Если вы создадите SMTP-сообщение в нужный сеанс и будете использовать этот контент, ваша электронная почта будет содержать встроенное изображение! Например:
SMTPMessage m = new SMTPMessage(session);
m.setContent(content);
m.setSubject("Mail with embedded image");
m.setRecipient(RecipientType.TO, new InternetAddress("your@email.com"));
Transport.send(m)
Дайте мне знать, если это работает для вас! ;)