Aprende a enviar correos electrónicos desde una aplicación Spring Boot utilizando Gmail SMTP. Configura tu proyecto, implementa un servicio de correo y prueba el envío de emails con Postman.
Enviar correos electrónicos en una aplicación Spring Boot es una funcionalidad común, ya sea para notificaciones, confirmaciones de registro o alertas. En este artículo, te enseñaré cómo configurar Spring Boot para enviar correos electrónicos usando Gmail SMTP, explicando cada detalle paso a paso.
Spring Boot simplifica la integración con servicios de correo mediante el Starter Mail. Para comenzar, necesitamos agregar la dependencia en nuestro archivo pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
🔹 ¿Qué hace esta dependencia?
Si tu aplicación es una API REST, también es recomendable agregar la siguiente dependencia para poder probar el envío de correos desde un endpoint:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
application.propertiesSpring Boot permite configurar un servidor SMTP fácilmente mediante propiedades en el archivo src/main/resources/application.properties:
spring.mail.host=smtp.gmail.com # Servidor SMTP de Gmail
spring.mail.port=587 # Puerto SMTP (587 para TLS, 465 para SSL)
spring.mail.username=tuemail@gmail.com # Tu cuenta de Gmail
spring.mail.password=tucontraseña # Tu contraseña o una contraseña de aplicación
spring.mail.properties.mail.smtp.auth=true # Habilitar autenticación
spring.mail.properties.mail.smtp.starttls.enable=true # Habilitar encriptación TLS
No olvides que lo mejor que puedes hacer es poner estas properties como secrets o variables de entorno.
📌 Nota Importante:
Google puede bloquear el acceso de aplicaciones menos seguras. Para evitarlo, puedes:
Para generar una contraseña de aplicación, sigue estos pasos:


spring.mail.password dentro del archivo application.properties.Ahora crearemos un servicio en EmailService.java para manejar el envío de correos electrónicos:
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
@Service // Indica que esta clase es un servicio de Spring Boot
public class EmailService {
private final JavaMailSender mailSender;
// Inyección de dependencias por constructor
public EmailService(final JavaMailSender mailSender) {
this.mailSender = mailSender;
}
public void enviarCorreo(String destinatario, String asunto, String cuerpo) {
SimpleMailMessage mensaje = new SimpleMailMessage();
mensaje.setTo(destinatario); // Configura el destinatario del correo
mensaje.setSubject(asunto); // Configura el asunto del correo
mensaje.setText(cuerpo); // Configura el contenido del mensaje
mensaje.setFrom("tuemail@gmail.com"); // Define quién envía el correo
mailSender.send(mensaje); // Envía el correo
}
}
Para probar nuestro servicio de correo, crearemos un controlador REST llamado EmailController.java:
import org.springframework.web.bind.annotation.*;
@RestController // Indica que esta clase manejará solicitudes HTTP
@RequestMapping("/email") // Define la ruta base para las peticiones
public class EmailController {
private final EmailService emailService;
public EmailController(final EmailService emailService) {
this.emailService = emailService;
}
@PostMapping("/send") // Define una ruta POST para enviar correos
public String enviarCorreo(@RequestParam String to,
@RequestParam String subject,
@RequestParam String body) {
emailService.sendEmail(to, subject, body);
return "Correo enviado correctamente a " + to;
}
}
🔹 Explicación línea por línea:
@RestController indica que esta clase es un controlador REST.@RequestMapping("/email") define que todas las rutas en esta clase comienzan con /email.private final EmailService emailService; declara el servicio de correo.EmailController(final EmailService emailService) evita el uso de @Autowired.@PostMapping("/send") expone un endpoint POST en /email/send.@RequestParam toma los parámetros de la URL y los usa como entrada para enviar el correo.Inicia la aplicación y prueba la API con Postman o en un navegador:
http://localhost:8080/email/send?destinatario=ejemplo@gmail.com&asunto=Prueba&cuerpo=Hola desde Spring Boot
Si todo está bien, recibirás un correo en tu bandeja de entrada. 🎉
En este artículo, aprendimos cómo:
✅ Configurar Spring Boot para usar Gmail SMTP.
✅ Crear un servicio de envío de correos.
✅ Construir una API REST para enviar emails desde Postman o el navegador.
🔹 Próximos pasos: Puedes mejorar esta implementación agregando:
Puedes encontrar el código completo de este ejemplo en el siguiente repositorio de GitHub:
🔗 Repositorio en GitHub: smtp-java
En lugar de incluir las credenciales directamente en el archivo application.properties, utiliza variables de entorno para proteger tu información sensible. Por ejemplo:
spring.mail.username=${EMAIL_USERNAME}
spring.mail.password=${EMAIL_PASSWORD}
Configura estas variables en tu entorno local o en el servidor donde se despliegue la aplicación.
Agrega manejo de excepciones para capturar errores al enviar correos y devolver mensajes más informativos al cliente:
@PostMapping("/send")
public ResponseEntity<String> enviarCorreo(@RequestParam String destinatario,
@RequestParam String asunto,
@RequestParam String cuerpo) {
try {
emailService.enviarCorreo(destinatario, asunto, cuerpo);
return ResponseEntity.ok("Correo enviado correctamente a " + destinatario);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Error al enviar el correo: " + e.getMessage());
}
}
Para enviar correos más atractivos, utiliza MimeMessage para incluir contenido HTML. Aquí tienes un ejemplo básico:
import org.springframework.mail.javamail.MimeMessageHelper;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
public void enviarCorreoHtml(String destinatario, String asunto, String htmlContenido) throws MessagingException {
MimeMessage mensaje = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mensaje, true);
helper.setTo(destinatario);
helper.setSubject(asunto);
helper.setText(htmlContenido, true); // El segundo parámetro indica que es HTML
helper.setFrom("tuemail@gmail.com");
mailSender.send(mensaje);
}
Con estas mejoras, tu implementación será más segura, robusta y profesional. 🚀