你的问题
据我所见,它看起来像您创建消息的方式,并且一切都是正确的!您使用正确的 MIME 类型和一切。
我不确定您为什么使用 DataSource 和 DataHandler,并且在图像上有一个 ContentID,但是您需要完成您的问题,以便我能够解决更多问题。特别是以下行:
bodyPart.setContent(message, "text/html; charset=ISO-8859-1");
里面有什么message
?它包含<img src="cid:image" />
吗?
您是否尝试使用String cid = ContentIdGenerator.getContentId();
而不是使用生成 ContentIDimage
资源
这篇博客文章教我如何使用正确的消息类型,附加我的图片并参考 HTML 正文中的附件:如何使用 Java 发送带有嵌入式图片的电子邮件
细节
信息
您必须使用MimeMultipart
该类创建您的内容。重要的是使用字符串"related"
作为构造函数的参数,告诉 JavaMail 你的部分正在“一起工作”。
MimeMultipart content = new MimeMultipart("related");
内容标识符
您需要生成一个 ContentID,它是一个字符串,用于标识您附加到电子邮件的图像并从电子邮件正文中引用它。
String cid = ContentIdGenerator.getContentId();
注意:这个ContentIdGenerator
类是假设的。您可以创建一个或内联创建内容 ID。就我而言,我使用一个简单的方法:
import java.util.UUID;
// ...
String generateContentId(String prefix) {
return String.format("%s-%s", prefix, UUID.randomUUID());
}
HTML 正文
HTML 代码是MimeMultipart
内容的一部分。为此使用MimeBodyPart
课程。设置该部分的文本时不要忘记指定encoding
and !"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)
让我知道这是否适合你!;)