как внедрить несколько изображений при отправке HTML-письма с помощью Java mail

#java #image #embed #mime #jakarta-mail

#java #изображение #Внедрить #mime #джакарта-почта

Вопрос:

Я пытаюсь отправить электронное письмо с javamail. Я внедряю изображения и использую CID. Но проблема в том, как мне встроить несколько изображений в одно сообщение. если я попытаюсь добавить в заголовок.. он просто использует последний установленный заголовок. как мне добавить несколько изображений и ссылку, используя CID.

 MimeMultipart multipart = new MimeMultipart("related");

    // first part  (the html)
    BodyPart messageBodyPart = new MimeBodyPart();
//    BodyPart messageBodyPart = new MimeBodyPart();
    String htmlText = "<H1>Hello</H1><br/> <p align=center><img src="cid:senny"> </p>";
    htmlText ="<p align=center><img src="cid:senny"> </p>";
    htmlText ="<p align=center><img src="cid:image"> </p>";
    messageBodyPart.setContent(htmlText, "text/html");

    // add it
    multipart.addBodyPart(messageBodyPart);

    // second part (the image)
    messageBodyPart = new MimeBodyPart();
    DataSource fds = new FileDataSource
      ("C:\images\cec_header_457.png");
    DataSource fds1 = new FileDataSource
    ("C:\images\cec_header_420.png");
    messageBodyPart.setDataHandler(new DataHandler(fds));
    messageBodyPart.setDataHandler(new DataHandler(fds1));
    messageBodyPart.addHeader("Content-ID","<image>");
    messageBodyPart.addHeader("Content-ID","<senny>");
    // add it
    multipart.addBodyPart(messageBodyPart);

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

Ответ №1:

Каждое изображение должно быть отдельной частью MimeBodyPart, разбейте этот код,

 // second part (the image)
messageBodyPart = new MimeBodyPart();
DataSource fds = new FileDataSource
  ("C:\images\cec_header_457.png");
DataSource fds1 = new FileDataSource
("C:\images\cec_header_420.png");
messageBodyPart.setDataHandler(new DataHandler(fds));
messageBodyPart.setDataHandler(new DataHandler(fds1));
messageBodyPart.addHeader("Content-ID","<image>");
messageBodyPart.addHeader("Content-ID","<senny>");
// add it
multipart.addBodyPart(messageBodyPart);
  

На две части, что-то вроде

 // second part (the image)
messageBodyPart = new MimeBodyPart();
DataSource fds1 = new FileDataSource
("C:\images\cec_header_420.png");
messageBodyPart.setDataHandler(new DataHandler(fds1));
messageBodyPart.addHeader("Content-ID","<senny>");
// add it
multipart.addBodyPart(messageBodyPart);

messageBodyPart = new MimeBodyPart();
DataSource fds = new FileDataSource
  ("C:\images\cec_header_457.png");
messageBodyPart.setDataHandler(new DataHandler(fds));
messageBodyPart.addHeader("Content-ID","<image>");
// add it
multipart.addBodyPart(messageBodyPart);
  

Ответ №2:

Да, каждому изображению нужен свой собственный MimeBodyPart. Приведенное выше решение предназначено только для двух изображений. В случае, если имеется несколько изображений, неэффективно создавать несколько объектов для MimeBodyPart.

Итак, давайте перейдем к функции,

 public void imgUpload(Multipart multipart,String fileName) throws MessagingException
{
    int no = rand.nextInt();
    String contentId = Integer.toString(no);
    System.out.println(contentId);

    BodyPart messageBodyPart = new MimeBodyPart();
    String htmlText = "<img align=" center " src="cid:" contentId ""><br>";
    messageBodyPart.setContent(htmlText "<br>", "text/html");

    // add it
    multipart.addBodyPart(messageBodyPart);
    System.out.println(contentId);

    // second part (the image)
    messageBodyPart = new MimeBodyPart();
    DataSource fds = new FileDataSource(fileName);

    messageBodyPart.setDataHandler(new DataHandler(fds));
    messageBodyPart.setHeader("Content-ID", "<" contentId ">");
    System.out.println(contentId);

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

Здесь передаваемыми параметрами являются объект MimeBodyPart и путь к изображению.
Каждому изображению нужен свой собственный идентификатор содержимого, поэтому идентификатор содержимого генерируется случайным образом для этого сценария.

Полный код для встраивания нескольких изображений :

 import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

public class SendImageEmail
{
   public static void main(String [] args)
   {
      SendImageEmail sendEmail = new SendImageEmail(); 
      sendEmail.SendemailwithImage();
   } 
   public void imgUpload(Multipart multipart,String fileName) throws MessagingException
   {
     int no = rand.nextInt();
     String contentId = Integer.toString(no);
     System.out.println(contentId);

     BodyPart messageBodyPart = new MimeBodyPart();
     String htmlText = "<img align=" center " src="cid:" contentId ""><br>";
     messageBodyPart.setContent(htmlText "<br>", "text/html");

     // add it
     multipart.addBodyPart(messageBodyPart);
     System.out.println(contentId);

     // second part (the image)
     messageBodyPart = new MimeBodyPart();
     DataSource fds = new FileDataSource(fileName);

     messageBodyPart.setDataHandler(new DataHandler(fds));
     messageBodyPart.setHeader("Content-ID", "<" contentId ">");
     System.out.println(contentId);

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

  public void SendemailwithImage(){
       SendImageEmail imgEmail = new SendImageEmail(); 
       List<String> imgPath = new ArrayList<String>();
       imgPath.add("D:\img1.png");
       imgPath.add("D:\img2.png");
       imgPath.add("D:\img3.png");

  // Recipient's email ID needs to be mentioned.
  String to = "abcd@gmail.com";

  // Sender's email ID needs to be mentioned
  String from = "web@gmail.com";

  // Assuming you are sending email from localhost
  String host = "localhost";

  // Get system properties
  Properties properties = System.getProperties();

  // Setup mail server
  properties.setProperty("mail.smtp.host", host);

  // Get the default Session object.
  Session session = Session.getDefaultInstance(properties);

  try{
     // Create a default MimeMessage object.
     MimeMessage message = new MimeMessage(session);

     // Set From: header field of the header.
     message.setFrom(new InternetAddress(from));

     // Set To: header field of the header.
     message.addRecipient(Message.RecipientType.TO,
                              new InternetAddress(to));

     // Set Subject: header field
     message.setSubject("This is the Subject Line!");

     // Create the message part 
     BodyPart messageBodyPart = new MimeBodyPart();

     // Fill the message
     messageBodyPart.setText("This is message body");

     // Create a multipar message
     Multipart multipart = new MimeMultipart();

     // Set text message part
     multipart.addBodyPart(messageBodyPart);

    for(String fileName : imgPath)
     {
       imgEmail.upload(multipart,fileName); 
     }       
     // Send the complete message parts
     message.setContent(multipart );

     // Send message
     Transport.send(message);
     System.out.println("Sent message successfully....");
  }catch (MessagingException mex) {
     mex.printStackTrace();
  }}}