API JavaMail: envío de correo electrónico con imágenes en línea

Aquí hay un ejemplo para enviar un correo electrónico HTML desde su máquina con una imagen en línea. Aquí hemos utilizado el servidor JangoSMPT a través del cual se envían correos electrónicos a nuestra dirección de correo electrónico de destino. La configuración se explica en el capítulo Configuración del entorno .

Para enviar un correo electrónico con una imagen en línea, los pasos que se siguen son:

  • Obtener una sesión

  • Cree un objeto MimeMessage predeterminado y establezca From, To, Subject en el mensaje.

  • Cree un objeto MimeMultipart.

  • En nuestro ejemplo tendremos una parte HTML y una imagen en el correo electrónico. Entonces, primero cree el contenido HTML y configúrelo en el objeto multiparte como:

    // first part (the html)
    BodyPart messageBodyPart = new MimeBodyPart();
    String htmlText = "<H1>Hello</H1><img src=\"cid:image\">";
    messageBodyPart.setContent(htmlText, "text/html");
    // add it
    multipart.addBodyPart(messageBodyPart);
  • A continuación, agregue la imagen creando un Datahandler de la siguiente manera:

    // second part (the image)
    messageBodyPart = new MimeBodyPart();
    DataSource fds = new FileDataSource(
     "/home/manisha/javamail-mini-logo.png");
    
    messageBodyPart.setDataHandler(new DataHandler(fds));
    messageBodyPart.setHeader("Content-ID", "<image>");
  • A continuación, configure el multiparte en el mensaje de la siguiente manera:

    message.setContent(multipart);
  • Envíe el mensaje utilizando el objeto Transporte.

Crear clase Java

Crea un archivo de clase java SendInlineImagesInEmail, cuyo contenido es el siguiente:

package com.tutorialspoint;

import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class SendInlineImagesInEmail {
   public static void main(String[] args) {
      // Recipient's email ID needs to be mentioned.
      String to = "[email protected]";

      // Sender's email ID needs to be mentioned
      String from = "[email protected]";
      final String username = "manishaspatil";//change accordingly
      final String password = "******";//change accordingly

      // Assuming you are sending email through relay.jangosmtp.net
      String host = "relay.jangosmtp.net";

      Properties props = new Properties();
      props.put("mail.smtp.auth", "true");
      props.put("mail.smtp.starttls.enable", "true");
      props.put("mail.smtp.host", host);
      props.put("mail.smtp.port", "25");

      Session session = Session.getInstance(props,
         new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
               return new PasswordAuthentication(username, password);
            }
         });

      try {

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

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

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

         // Set Subject: header field
         message.setSubject("Testing Subject");

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

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

         // second part (the image)
         messageBodyPart = new MimeBodyPart();
         DataSource fds = new FileDataSource(
            "/home/manisha/javamail-mini-logo.png");

         messageBodyPart.setDataHandler(new DataHandler(fds));
         messageBodyPart.setHeader("Content-ID", "<image>");

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

         // put everything together
         message.setContent(multipart);
         // Send message
         Transport.send(message);

         System.out.println("Sent message successfully....");

      } catch (MessagingException e) {
         throw new RuntimeException(e);
      }
   }
}

Como usamos el servidor SMTP proporcionado por el proveedor de host JangoSMTP, necesitamos autenticar el nombre de usuario y la contraseña. La clase javax.mail.PasswordAuthentication se utiliza para autenticar la contraseña.

Compilar y ejecutar

Ahora que nuestra clase está lista, compilemos la clase anterior. He guardado la clase SendInlineImagesInEmail.java en el directorio:/home/manisha/JavaMailAPIExercise. Necesitaríamos los jars javax.mail.jar y activación.jar en la ruta de clases. Ejecute el siguiente comando para compilar la clase (ambos frascos se colocan en el directorio / home / manisha /) desde el símbolo del sistema:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendInlineImagesInEmail.java

Ahora que la clase está compilada, ejecute el siguiente comando para ejecutar:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendInlineImagesInEmail

Verificar salida

Debería ver el siguiente mensaje en la consola de comandos:

Sent message successfully....

Como envío un correo electrónico a mi dirección de Gmail a través de JangoSMTP, se recibiría el siguiente correo en la bandeja de entrada de mi cuenta de Gmail: