Servlets JavaMail:生成的内联图像不正确

Servlets JavaMail:生成的内联图像不正确,servlets,jakarta-mail,Servlets,Jakarta Mail,我在下面编写了servlet,它使用JavaMail以.eml格式生成电子邮件作为响应。浏览器检测到mime类型,并在收到响应时打开电子邮件应用程序Microsoft Live in my case。X-Unsent设置为1,因此打开电子邮件时可以编辑和发送 电子邮件内容是内嵌图像的HTML。当我打开生成的电子邮件时,我可以看到没有问题的内容。但是,当我输入地址并尝试发送电子邮件时,我收到一条或多条图像无法找到的消息,是否要继续?。我以任何方式发送它,当我检查电子邮件收件人的帐户时,会收到该电子

我在下面编写了servlet,它使用JavaMail以.eml格式生成电子邮件作为响应。浏览器检测到mime类型,并在收到响应时打开电子邮件应用程序Microsoft Live in my case。X-Unsent设置为1,因此打开电子邮件时可以编辑和发送

电子邮件内容是内嵌图像的HTML。当我打开生成的电子邮件时,我可以看到没有问题的内容。但是,当我输入地址并尝试发送电子邮件时,我收到一条或多条图像无法找到的消息,是否要继续?。我以任何方式发送它,当我检查电子邮件收件人的帐户时,会收到该电子邮件,但不会将图像内联,而是将其附加。生成内联图像的方式似乎有问题。有什么想法吗

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

  response.setContentType("message/rfc822");
  response.setHeader("Content-Disposition", "attachment; filename=\"email.eml\"");

  PrintWriter out = response.getWriter();

  String eml = null;

  try {

    Message message = new MimeMessage(Session.getInstance(System.getProperties()));
    message.addHeader("X-Unsent", "1");
    message.setSubject("email with inline image");

     // This mail has 2 parts, the BODY and the embedded image
     MimeMultipart multipart = new MimeMultipart("related");

     // first part (the html)
     BodyPart messageBodyPart = new MimeBodyPart();
     String htmlText = "<H1>This is the image: </H1><img src=\"cid:image\">";
     messageBodyPart.setContent(htmlText, "text/html");
     multipart.addBodyPart(messageBodyPart);

     // second part (the image)
     messageBodyPart = new MimeBodyPart();
     String filePath = "C:/image.png";
     DataSource fds = new FileDataSource(filePath);

     messageBodyPart.setDataHandler(new DataHandler(fds));
     messageBodyPart.setHeader("Content-Type", "image/png");
     messageBodyPart.setHeader("Content-ID", "image");
     messageBodyPart.setDisposition( MimeBodyPart.INLINE );

     // add image to the multipart
     multipart.addBodyPart(messageBodyPart);

     // put everything together
     message.setContent(multipart);

    ByteArrayOutputStream os = new ByteArrayOutputStream();
    message.writeTo(os);
    eml = new String(os.toByteArray(),"UTF-8");
  }
  catch (MessagingException e) {
    e.printStackTrace();
  } 
  catch (IOException e) {
    e.printStackTrace();
  }

  out.print(eml);
  out.flush();
  out.close();

}

请尝试此更简单的版本,该版本可能也会解决此问题:

 // first part (the html)
 MimeBodyPart messageBodyPart = new MimeBodyPart();
 String htmlText = "<H1>This is the image: </H1><img src=\"cid:image\">";
 messageBodyPart.setText(htmlText, null, "html");
 multipart.addBodyPart(messageBodyPart);

 // second part (the image)
 messageBodyPart = new MimeBodyPart();
 String filePath = "C:/image.png";
 messageBodyPart.attachFile(filePath, "image/png", "base64");
 messageBodyPart.setContentID("<image>");

 // add image to the multipart
 multipart.addBodyPart(messageBodyPart);

谢谢,这很有效,但是我必须使用messageBodyPart.AttachFilePath,因为它需要一个参数。您必须仍然使用JavaMail 1.4.x,新方法是在JavaMail 1.5中添加的。获取最新版本。