使用 JavaMail 在电子邮件中内联图像您的问题源详

2022-09-01 09:28:45

我想使用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");

但无论如何,图像作为附件发送,内容处置正在变成“附件”。

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


答案 1

您的问题

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

我不确定为什么你使用DataSource和DataHandler,并在图像上有一个ContentID,但你需要完成你的问题,以便我能够进行更多的故障排除。特别是,以下行:

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

里面有什么?它是否包含 ?message<img src="cid:image" />

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


这篇博客文章教会了我如何使用正确的消息类型,附加我的图像并引用HTML正文中的附件:如何使用Java发送带有嵌入式图像的电子邮件


消息

您必须使用 MimeMultipart 类创建内容。使用字符串作为构造函数的参数非常重要,可以告诉 JavaMail 您的部件正在“协同工作”。"related"

MimeMultipart content = new MimeMultipart("related");

内容标识符

您需要生成一个ContentID,它是一个字符串,用于识别您附加到电子邮件的图像并从电子邮件正文中引用它。

String cid = ContentIdGenerator.getContentId();

注意:此类是假设的。您可以创建一个或内联创建内容 ID。在我的情况下,我使用一个简单的方法:ContentIdGenerator

import java.util.UUID;

// ...

String generateContentId(String prefix) {
     return String.format("%s-%s", prefix, UUID.randomUUID());
}

正文

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);

请注意,作为图像的来源,我们使用和生成的 ContentID。cid:

图像附件

我们可以为图像的附件创建另一个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)

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


答案 2

你为什么不试试这样的东西呢?

    MimeMessage mail =  new MimeMessage(mailSession);

    mail.setSubject(subject);

    MimeBodyPart messageBodyPart = new MimeBodyPart();

    messageBodyPart.setContent(message, "text/html");

    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);

    messageBodyPart = new MimeBodyPart();
    DataSource source = new FileDataSource(new File("complete path to image.jpg"));
    messageBodyPart.setDataHandler(new DataHandler(source));
    messageBodyPart.setFileName(fileAttachment.getName());
    messageBodyPart.setDisposition(MimeBodyPart.INLINE);
    multipart.addBodyPart(messageBodyPart);

    mail.setContent(multipart);

在消息中,有一个标签,你应该没问题。 <img src="image.jpg"/>

祝你好运


推荐