Envío de correo electrónico en Java con Jakarta Mail (JavaMail)
El envío de correos electrónicos es una de las tareas más demandadas en aplicaciones empresariales en Java: registro de usuarios, notificaciones, recuperación de contraseñas y envíos de marketing. Durante mucho tiempo, el estándar de facto fue la biblioteca JavaMail, pero tras la migración de Java EE a Eclipse Foundation, pasó a llamarse Jakarta Mail. En esta guía, analizaremos en detalle cómo configurar y usar Jakarta Mail para enviar correos electrónicos en Java.
¿Qué es Jakarta Mail?
Jakarta Mail (anteriormente JavaMail) es una API para enviar, recibir y procesar correos electrónicos en aplicaciones Java. La biblioteca admite los protocolos SMTP, POP3 e IMAP, así como el estándar MIME, lo que permite enviar tanto mensajes de texto simples como mensajes con adjuntos, formato HTML e imágenes.
Instalación y configuración de dependencias
Para trabajar con Jakarta Mail, debe agregar la dependencia a su proyecto. Si usa Maven, agréguela en pom.xml:
<dependency> <groupId>com.sun.mail</groupId> <artifactId>jakarta.mail</artifactId> <version>2.0.1</version></dependency>Para Gradle:
implementation 'com.sun.mail:jakarta.mail:2.0.1'Importante: Si usa Java 8 o superior, asegúrese de que la versión de Jakarta Mail sea compatible; para Java 8, la versión 1.6.x es adecuada (por ejemplo, javax.mail:javax.mail-api:1.6.2).
Envío básico de correo electrónico en Java
Veamos el ejemplo más simple: enviar un mensaje de texto a través del servidor SMTP de Gmail. Para ello, necesitará:
- Una cuenta de Gmail (u otro servicio de correo)
- Una contraseña de aplicación (si la autenticación de dos factores está activada)
- Permiso para acceder a aplicaciones menos seguras (si es necesario)
Código de envío:
import jakarta.mail.*;import jakarta.mail.internet.*;import java.util.Properties;
public class EmailSender { public static void main(String[] args) { // 1. Configuración de propiedades de conexión Properties props = new Properties(); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.port", "587"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true");
// 2. Autenticación Session session = Session.getInstance(props, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("your-email@gmail.com", "your-app-password"); } });
try { // 3. Creación del mensaje Message message = new MimeMessage(session); message.setFrom(new InternetAddress("from-email@gmail.com")); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("recipient@example.com")); message.setSubject("Correo de prueba desde Java"); message.setText("¡Hola! Este correo fue enviado con Jakarta Mail.");
// 4. Envío Transport.send(message); System.out.println("¡Correo enviado exitosamente!"); } catch (MessagingException e) { e.printStackTrace(); } }}Envío de correos HTML y con adjuntos
A menudo es necesario enviar un correo con formato (HTML) o adjuntar un archivo. Para ello, se utilizan MimeMultipart y MimeBodyPart.
Correo HTML
MimeBodyPart htmlPart = new MimeBodyPart();htmlPart.setContent("<h1>¡Hola!</h1><p>Este es un correo HTML desde Java.</p>", "text/html; charset=utf-8");
Multipart mu