Para enviar correos desde una Aplicación Java, es necesario utilizar una librería adicional. El API JavaMail, desarrollado por Oracle, proporciona las funcionalidades de construcción y envío de correos.

– En primer lugar, debemos descargar JavaMail aquí.

– Luego descomprimir y extraer el archivo mail.jar
– En nuestro IDE (Netbeans, Eclipse,..), agregar el JAR al Proyecto Java.

– Crear la clase MailSender que inicialice los parámetros del mensaje y provea de un método que envíe el mensaje. En el siguiente ejemplo se ha configurado una cuenta de Gmail para el envío de mensajes :

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.Multipart;
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 MailSender {
    private final Properties properties = new Properties();
    private Session session;

    private void init() {
        properties.put("mail.smtp.host", "smtp.gmail.com");
        properties.put("mail.smtp.starttls.enable", "true");
        properties.put("mail.smtp.port", 587);
        properties.put("mail.smtp.mail.sender", "micuenta@gmail.com");
        properties.put("mail.smtp.password", "miclave");
        properties.put("mail.smtp.user", "micuenta@gmail.com");
        properties.put("mail.smtp.auth", "true");
        session = Session.getDefaultInstance(properties);
    }
    public void send(String destino, String asunto, String mensaje) {
        init();
        try {
           MimeMessage message = new MimeMessage(session);
           message.setFrom(new InternetAddress((String) properties.get("mail.smtp.mail.sender")));
           message.addRecipient(Message.RecipientType.TO, new InternetAddress(destino));
           message.setSubject(asunto);
           message.setContent(mensaje,"text/html");
           Transport t = session.getTransport("smtp");
           t.connect((String) properties.get("mail.smtp.user"), (String) properties.get("mail.smtp.password"));
           t.sendMessage(message, message.getAllRecipients());
           t.close();
        } catch (MessagingException e) {
          return;
        }
    }

    public void send(String destino, String asunto, String mensaje, String nombre_archivo, String ruta_archivo) {
        init();
        try {
           MimeMessage message = new MimeMessage(session);
           message.setFrom(new InternetAddress((String) properties.get("mail.smtp.mail.sender")));
           message.addRecipient(Message.RecipientType.TO, new InternetAddress(destino));
           message.setSubject(asunto);
           BodyPart messageBodyPart = new MimeBodyPart();
           messageBodyPart.setText(mensaje);
           Multipart multipart = new MimeMultipart();
           multipart.addBodyPart(messageBodyPart);
           messageBodyPart = new MimeBodyPart();
           String filename = ruta_archivo;
           DataSource source = new FileDataSource(filename);
           messageBodyPart.setDataHandler(new DataHandler(source));
           messageBodyPart.setFileName(nombre_archivo);
           multipart.addBodyPart(messageBodyPart);
           message.setContent(multipart);
           Transport t = session.getTransport("smtp");
           t.connect((String) properties.get("mail.smtp.user"), (String) properties.get("mail.smtp.password"));
           t.sendMessage(message, message.getAllRecipients());
           t.close();
        } catch (MessagingException e) {
           return;
        }
    } 
}

– Finalmente para enviar el correo, se llama al método send de la clase MailSender de la siguiente forma:

MailSender mail = new MailSender();
mail.send("destino@mail.com","Esto es una prueba","Este correo fue enviado usando JavaMail");
mail.send("destino@mail.com","Esto es una prueba","Este correo fue enviado usando JavaMail","adjunto.pdf","C:\\ruta\\archivo.pdf");

Puntuación: 4.36 / Votos: 11
JavaMail: Enviar correos desde una Aplicación Java
Etiquetado en:    

5 thoughts on “JavaMail: Enviar correos desde una Aplicación Java

  • 24 febrero, 2014 a las 3:04 pm
    Enlace permanente

    Hola muy bueno,Funciona prefectamente pero faltan comentarios para poder entender muy bien este codigo,Pero de todos modos Muy bueno

    Gracias…..

    Responder
  • 7 mayo, 2015 a las 2:09 pm
    Enlace permanente

    Excelente!! Facilísimo de usar! Lo implementé y funciona perfectamente…
    Sólo encontré una limitación:
    Hice pruebas con envío masivo (a varios e-mails), y no funciona poniendo correos separados por comas.
    Pero en otro lado encontré que puedes repetir la sentencia:
    message.addRecipient(Message.RecipientType.TO, … );

    Una dificultad que tuve, fue que en la cuenta de correo fuente (desde donde envío emails) necesitas desactivar un criterio de protección; sino, no va a permitir la salida de correos. No sé si otros gestores de correo actualmente presenten esa rigurosidad en seguridad; para tener en cuenta en caso no se envíe ningún correo.
    PD: Los archiva en la carpeta “enviados” del emisor.

    Responder
    • 7 mayo, 2015 a las 4:15 pm
      Enlace permanente

      Hola!
      Para envío a varias direcciones puedes usar la siguiente línea:
      message.addRecipients(Message.RecipientType.TO,InternetAddress.parse("user1@hotmail.com,user2@gmail.com,user3@yahoo.com"));
      Para agregar los correos en copia (CC) utilizar Message.RecipientType.CC

      Sobre el criterio de protección que mencionas, la cuenta no debe tener autenticación en dos pasos vía generador de código u otro medio. Sólo he probado con GMAIL así que no te podría afirmar si otros servicios de correo tienen otras restricciones.

      Saludos y gracias por tu comentario!

      Responder
  • 11 julio, 2016 a las 1:56 am
    Enlace permanente

    Hola queria hacer una consulta para testearlo es necesario deployarlo en , yo estoy trabajando con GAE de google o puedo probarlo de manera local y deberia funcionar , GRACIAS

    Responder

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *