Как встроить несколько изображений при отправке HTML-почты с использованием почты Java - PullRequest
6 голосов
/ 01 мая 2011

Я пытаюсь отправить письмо с 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);

Ответы [ 2 ]

13 голосов
/ 01 мая 2011

Каждое изображение должно быть своим 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);
0 голосов
/ 19 июля 2016

Да, для каждого изображения необходим собственный 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();
  }}}
...