Enviar correo JavaMail con texto html y adjunto

Bienvenidos a este nuevo Post. 

En este caso, hablaré de un tema bastante útil y es enviar correos electrónicos a través de Java con texto en formato html y con un archivo adjunto.

Para lograrlo, nos apoyaremos de la librería JavaMail. Una vez descargada será necesario agregarla a su proyecto para poder utilizarla.

Sin más preámbulos adjunto el código fuente y lo comento para ver su funcionamiento:

Clase Mailer (contiene la función para mandar el correo):


package com.ea24.email;
package com.ea24.email;
 
import java.awt.HeadlessException;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
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;
 
/**
 *
 * @author ea24
 */
public class Mailer {
    Properties mailProps;
 
    public Mailer(Properties mailProps) {
        this.mailProps = mailProps;
    }
 
    public boolean sendMail(String user, String pass, String recipient) {
        try {
            Session session = Session.getDefaultInstance(mailProps, null);
            session.setDebug(true);
            //Se compone la parte del texto
            BodyPart text = new MimeBodyPart();
            text.setContent("n"
                    + "<h2>
<span style="color: red;">Comunicándose desde Java</span></h2>
n"
                    + "Este email ha sido enviado desde java
 
n"
                    + "", "text/html");
            // Se compone el archivo adjunto
            BodyPart attached = new MimeBodyPart();
            attached.setDataHandler(new DataHandler(new FileDataSource("C:/archivo.doc")));
            attached.setFileName("Archivo adjunto.doc");
 
            // Una MultiParte para agrupar texto y adjunto.
            MimeMultipart multiPart = new MimeMultipart();
            multiPart.addBodyPart(text);
            multiPart.addBodyPart(attached);
 
            // Se compone el correo, dando to, from, subject y el contenido.
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(user));
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipient));
            message.setSubject("Correo desde JavaMail");
            message.setContent(multiPart);
 
            // Se envia el correo.
            Transport transport = session.getTransport("smtp");
            transport.connect(user, pass);
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        } catch (HeadlessException e) {
            System.out.println(e.getMessage());
            return false;
        } catch (MessagingException e) {
            System.out.println(e.getMessage());
            return false;
        }
        return true;
    }
 
}


La clase no es muy complicada, contiene sólo un atributo de tipo Properties mailProps y que es el contiene las propiedades para la conexión con el servidor de correo y un constructor que recibe como parámetro ese objeto de tipo Properties. 

Luego está el único método sendMail que recibe tres parámetros user, pass y recipient donde:
user: es el usuario de correo desde el que se mandará el mail 
pass: es la contraseña del correo desde el que se mandará el mail 
recipient: es el usuario de correo que recibirá el mail 


De inicio se requiere un objeto de Session mismo que recibe el objeto Properties para su instanciación. El método setDebug le indicará a la sesión si debe debuggear y mostrar todo lo sucedido con ella. 

Para este caso al contener texto y adjuntos se debe utilizar un BodyPart para el texto y otro para el adjunto. Para que el texto tenga formato html, se debe indicar en el método de la siguiente manera: 
text.setContent("texto en formato html", "text/html");


Luego al bodyPart del adjunto, se le setea un dataHandler con el archivo a adjuntar. 

Después se crea un objeto de tipo MimeMultipart para agregar todas las partes (texto y adjunto, pero puede haber más). 

Hecho esto procedemos a crear la instancia de la clase MimeMessage para generar el mensaje completo seteando el usuario que envía, el que recibe, el asunto del mensaje y el contenido del mensaje. 

Finalemente con un objeto de tipo Transport, se inicia sesión con el usuario y contraseña de quien envía, se envía el mensaje con el método sendMessage de la siguiente forma; 

transport.sendMessage(message, message.getAllRecipients());


Ya sólo resta cerrar el transport. Se capturan las excepciones necesarias y es todo para la clase. 

Luego tenemos la clase de prueba: 


package com.ea24.email;
 
import java.util.Properties;
import javax.swing.JOptionPane;
 
/**
 *
 * @author ea24
 */
public class Main {    
    public static void main(String[] args) {
        //las propiedades para la conexión
        Properties mailProps = new Properties();
        mailProps.setProperty("mail.transport.protocol", "smtp"); 
        mailProps.setProperty("mail.smtp.host", "smtp.gmail.com");
        mailProps.setProperty("mail.smtp.starttls.enable", "true");
        mailProps.setProperty("mail.smtp.port", "587");
        mailProps.setProperty("mail.smtp.auth", "true");
         
        Mailer mailer = new Mailer(mailProps);
        boolean wasSend = mailer.sendMail("[email protected]", "password", "[email protected]");
        if(wasSend) {
            JOptionPane.showMessageDialog(null, "El correo se envió correctamente.");
        } else {
            JOptionPane.showMessageDialog(null, "No pudo enviarse el correo", "Error", JOptionPane.ERROR_MESSAGE);
        }
    }
}


Para la clase de prueba se crea el objeto de tipo properties y se llena con los valores adecuados según sea el servidor de correo. 

Depués se crea una instancia de la clase Mailer pasándole el archivo de propiedades y se llama al método sendMail pasándole el usuario, contraseña y destinatario. 
De acuerdo con lo que devuelva el método en la variable wasSend se determina si se envío o no el correo. 

Eso es básicamente todo lo que hay que hacer para el envío de correos electrónicos con texto en html y con archivos adjuntos.

Ojalá sea de utilidad para muchos, si hay dudas ya saben.

Saludos!
Enviar correo JavaMail con texto html y adjunto
0 Puntos Score: 0/10
Visitas: 1078 Favoritos: 3
7 Comentarios Enviar correo JavaMail con texto html y adjunto
Gracias por el aporte
Cita reformau: Mostrar
Espero sea ?
Hola, muchas gracias por este dato, una pregunta yo hatas ahora estoy empezando con los temas de desarrollo y me gustaria practicar con este codigo para enviarme correos a mi email, tu podiras decirme que debo instalar o q necesito para hacer esto ??? muchas gracias.

Ahh y no haces de casualidad tutoriales de shell unix ?

Saludos
Cita sandatomo: Mostrar
Qu?
Cita ea24: Mostrar
Cita sandatomo: Mostrar
Para dejar un comentario Registrate! o.. eres ya usuario? Accede!