java - 使用 JavaMail 在电子邮件中嵌入图像

标签 java mime mime-types jakarta-mail multipart

我想使用 javamail 发送一封内嵌图片的电子邮件。

我正在做这样的事情。

MimeMultipart content = new MimeMultipart("related");

BodyPart bodyPart = new MimeBodyPart();
bodyPart.setContent(message, "text/html; charset=ISO-8859-1");
content.addBodyPart(bodyPart);

bodyPart = new MimeBodyPart();
DataSource ds = new ByteArrayDataSource(image, "image/jpeg");
bodyPart.setDataHandler(new DataHandler(ds));
bodyPart.setHeader("Content-Type", "image/jpeg; name=image.jpg");
bodyPart.setHeader("Content-ID", "<image>");
bodyPart.setHeader("Content-Disposition", "inline");
content.addBodyPart(bodyPart);

msg.setContent(content);

我也试过

    bodyPart.setHeader("inline; filename=image.jpg");

    bodyPart.setDisposition("inline");

但无论如何,图像都是作为附件发送的,而 Content-Dispostion 正在变成“附件”。

如何使用 javamail 在电子邮件中内联发送图像?

最佳答案

你的问题

据我所知,它看起来像您创建消息的方式,并且一切都正确!您使用正确的 MIME 类型和所有内容。

我不确定您为什么使用 DataSource 和 DataHandler,并且在图像上有一个 ContentID,但您需要完成您的问题,以便我能够解决更多问题。特别是下面这行:

bodyPart.setContent(message, "text/html; charset=ISO-8859-1");

message 中的内容?是否包含<img src="cid:image" /> ?

您是否尝试使用 String cid = ContentIdGenerator.getContentId(); 生成 ContentID而不是使用image


来源

这篇博客文章教会了我如何使用正确的消息类型、附上我的图片并引用 HTML 正文中的附件:How to Send Email with Embedded Images Using Java


详情

留言

您必须使用 MimeMultipart 创建您的内容类(class)。使用字符串 "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"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表示此图像旨在显示在电子邮件中,而不是作为附件。

完成消息

就是这样!如果您在正确的 session 上创建 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)

让我知道这是否适合你! ;)

关于java - 使用 JavaMail 在电子邮件中嵌入图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2996514/

相关文章:

java - MimeBodyPart getContent 损坏二进制数据

php - 从 PhoneGap Cordova 应用程序上传图片

java - Lambert W 函数在 Java 中的实现

java - 文件.keystore和CAKey.pem在SSL中的作用?

java - 隐藏数组适配器中的元素,而不是删除它们

xml - LinkedIn 图片帖子未在预览中显示

php - 在 PHP 中处理 json 请求

Apache 2.4 设置没有扩展名的文件的 mime 类型

ruby-on-rails - 当 FileMagic 不是一个选项时,我如何可靠地确定文件类型?

java - 在 Lucene 中,ANALYZED 和 ANALYZED_NO_NORMS 有什么区别?