使用JavaMail在电子邮件中内嵌图像

aku*_*001 29 java mime multipart jakarta-mail mime-types

我想使用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);
Run Code Online (Sandbox Code Playgroud)

我也试过了

    bodyPart.setHeader("inline; filename=image.jpg");
Run Code Online (Sandbox Code Playgroud)

    bodyPart.setDisposition("inline");
Run Code Online (Sandbox Code Playgroud)

但无论如何,图像都作为附件发送,内容处理正在变成"附件".

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

sno*_*e92 34

你的问题

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

我不确定为什么你使用DataSource和DataHandler,并在图像上有ContentID,但是你需要为我完成问题才能解决更多问题.特别是,以下行:

bodyPart.setContent(message, "text/html; charset=ISO-8859-1");
Run Code Online (Sandbox Code Playgroud)

什么在message?它包含<img src="cid:image" />吗?

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


资源

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


细节

信息

您必须使用MimeMultipart该类创建内容.使用字符串"related"作为构造函数的参数非常重要,告诉JavaMail您的部件"一起工作".

MimeMultipart content = new MimeMultipart("related");
Run Code Online (Sandbox Code Playgroud)

内容标识符

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

String cid = ContentIdGenerator.getContentId();
Run Code Online (Sandbox Code Playgroud)

注意:这个ContentIdGenerator课程是假设的.您可以创建一个或内联创建内容ID.在我的例子中,我使用一个简单的方法:

import java.util.UUID;

// ...

String generateContentId(String prefix) {
     return String.format("%s-%s", prefix, UUID.randomUUID());
}
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

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

图片附件

我们可以MimeBodyPart为图像的附件创建另一个.

MimeBodyPart imagePart = new MimeBodyPart();
imagePart.attachFile("resources/teapot.jpg");
imagePart.setContentID("<" + cid + ">");
imagePart.setDisposition(MimeBodyPart.INLINE);
content.addBodyPart(imagePart);
Run Code Online (Sandbox Code Playgroud)

请注意,我们在<和之间使用相同的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)
Run Code Online (Sandbox Code Playgroud)

如果这对您有用,请告诉我!;)


小智 10

你为什么不尝试这样的事情?

    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);
Run Code Online (Sandbox Code Playgroud)

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

祝好运

  • 在邮件正文中使用img标记很重要.如果您的邮件客户端无法识别正在身体中使用的图像,则会将其显示为附件. (5认同)

小智 10

这对我有用:

  MimeMultipart rootContainer = new MimeMultipart();
  rootContainer.setSubType("related"); 
  rootContainer.addBodyPart(alternativeMultiPartWithPlainTextAndHtml); // not in focus here
  rootContainer.addBodyPart(createInlineImagePart(base64EncodedImageContentByteArray));
  ...
  message.setContent(rootContainer);
  message.setHeader("MIME-Version", "1.0");
  message.setHeader("Content-Type", rootContainer.getContentType());

  ...


  BodyPart createInlineImagePart(byte[] base64EncodedImageContentByteArray) throws MessagingException {
    InternetHeaders headers = new InternetHeaders();
    headers.addHeader("Content-Type", "image/jpeg");
    headers.addHeader("Content-Transfer-Encoding", "base64");
    MimeBodyPart imagePart = new MimeBodyPart(headers, base64EncodedImageContentByteArray);
    imagePart.setDisposition(MimeBodyPart.INLINE);
    imagePart.setContentID("&lt;image&gt;");
    imagePart.setFileName("image.jpg");
    return imagePart;
Run Code Online (Sandbox Code Playgroud)

  • 您是否可以发布整个代码或编写我们需要提供代码的文件和方法?谢谢 (4认同)