Cómo Enviar Correos Electrónicos en Spring Boot Usando Gmail SMTP

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.

Cómo Enviar Correos Electrónicos en Spring Boot Usando Gmail SMTP

📚 Tabla de Contenidos

Enviar Correos con Spring Boot usando Gmail SMTP

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.


1️⃣ Configurar el proyecto en Spring Boot

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?

  • Agrega las clases necesarias para enviar correos electrónicos en Spring Boot.
  • Nos permite configurar fácilmente un servidor SMTP.

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>

2️⃣ Configurar Gmail SMTP en application.properties

Spring 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:

    • Activar “Acceso de aplicaciones menos seguras” en tu cuenta de Google.
    • Usar una “Contraseña de Aplicación”, que es una clave generada específicamente para permitir acceso SMTP sin comprometer tu contraseña real.
  • Para generar una contraseña de aplicación, sigue estos pasos:

    1. Ve a la configuración de tu cuenta de Gmail y busca la opción “Contraseñas de aplicación”. alt text
    2. Coloca el nombre de la aplicación y haz clic en “Crear”.
    3. Se generará una contraseña que debes copiar. alt text
    4. Pega esta contraseña en la propiedad spring.mail.password dentro del archivo application.properties.

3️⃣ Crear un servicio para enviar correos

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
    }
}

4️⃣ Crear un controlador REST para probar el envío de correos

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.
  • La inyección de dependencias por constructor 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.

5️⃣ Probar el envío de correos con Postman o el navegador

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. 🎉


Conclusión

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:

  • 📎 Adjuntos en los correos.
  • 🖼 Plantillas HTML para correos más atractivos.
  • 🔄 Manejo de errores para validar direcciones de correo antes de enviarlas.

Video Tutorial

🔗 Mira el video tutorial aquí

Repositorio con el Ejemplo

Puedes encontrar el código completo de este ejemplo en el siguiente repositorio de GitHub:

🔗 Repositorio en GitHub: smtp-java


Mejoras sugeridas

1️⃣ Uso de variables de entorno para mayor seguridad

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.

2️⃣ Manejo de errores en el controlador

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());
    }
}

3️⃣ Uso de plantillas HTML

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. 🚀