title

Nodemailer para enviar correos electrónicos en Javascript


Nodemailer es una biblioteca popular en el ecosistema de Node.js que permite a los desarrolladores enviar correos electrónicos de manera sencilla y eficiente. Es ideal para aplicaciones web que necesitan notificar a los usuarios, enviar facturas, confirmaciones de registro o cualquier otro tipo de comunicación por correo electrónico.

En este artículo, exploraremos cómo usar Nodemailer con ejemplos prácticos en español. Aprenderás desde la instalación hasta la configuración y envío de correos electrónicos.

Instalación de Nodemailer

Para comenzar, asegúrate de tener Node.js instalado en tu sistema. Luego, puedes instalar Nodemailer usando npm (Node Package Manager) con el siguiente comando:

npm install nodemailer

Configuración básica

Antes de enviar correos electrónicos, necesitas configurar un “transportador” que se encargará de establecer la conexión con el servidor de correo. Este transportador puede ser Gmail, Outlook, Yahoo u otros servicios SMTP.

Aquí tienes un ejemplo básico de configuración utilizando Gmail como servicio de correo desde una clase usando Typescript:

const nodemailer = require('nodemailer');

export class NodemailerService {
  private transporter;
 const initialize = () => {
    let transporter = nodemailer.createTransport({
          service: 'gmail', // Servicio de correo
          auth: {
                 user: 'tucorreo@gmail.com',
                 pass: 'tucontraseña'
          }
   });

 .....
}

Nota importante: Si usas Gmail, es posible que necesites habilitar la opción “Acceso de aplicaciones menos seguras” en tu cuenta de Google. Sin embargo, esto no es recomendable para entornos de producción. En su lugar, considera usar OAuth2 para autenticarte de forma segura.

Enviar un correo electrónico simple

Una vez configurado el transportador, puedes enviar un correo electrónico básico. Aquí tienes un ejemplo

....
const send = () => {
   let mailOptions = {
       from: 'tucorreo@gmail.com',
       to: 'destinatario@example.com', 
       subject: 'Hola desde Encodebiz', 
       text: 'Este es un correo enviado desde Node.js usando Nodemailer.' 
   };

transporter.sendMail(mailOptions, (error, info) => {
   if (error) {
     return new throw('Error al enviar el correo:', error);
   }
   console.log('Correo enviado:', info.response);
 });
}
}


En este ejemplo:

  • from especifica la dirección del remitente.
  • to indica la dirección del destinatario.
  • subject define el asunto del correo.
  • text contiene el contenido del mensaje en formato de texto plano.


Enviar correos con HTML


Nodemailer también permite enviar correos electrónicos con contenido HTML. Esto es útil si deseas personalizar el diseño del correo con estilos y elementos visuales.

....
const send = () => {
   let mailOptions = {
       from: 'tucorreo@gmail.com',
       to: 'destinatario@example.com', 
       subject: 'Hola desde Encodebiz', 
       html: '<h1>Bienvenido</h1><p>Gracias por registrarte en nuestra plataforma.</p>'
   };

transporter.sendMail(mailOptions, (error, info) => {
   if (error) {
     return new throw('Error al enviar el correo:', error);
   }
   console.log('Correo enviado:', info.response);
 });
}
}

Puedes crear plantillas en formato html y pasarles variables dinamicamente, luego generar desde una función el código html ya con los valores sustituidos en la plantilla:

 ---
  private async generateHtmlTemplate(   
    replacements?: Record<string, string>
  ): Promise<string> {
    const templates: any = {
      cita,
      newsletter,
      contact,
    };

    let template: string ='Hola {{user}}, <h1>Bienvenido</h1><p>Gracias por registrarte en nuestra plataforma.</p>'

    if (replacements) {
      Object.keys(replacements).forEach((key) => {
        const regex = new RegExp(`{{${key}}}`, "g");
        template = template.replace(regex, replacements[key]);
      });
    }

    return template;
  }


const send = () => {
   let mailOptions = {
       from: 'tucorreo@gmail.com',
       to: 'destinatario@example.com', 
       subject: 'Hola desde Encodebiz', 
       html: this.generateHtmlTemplate({user:'Jhon Doe'})
   };

transporter.sendMail(mailOptions, (error, info) => {
   if (error) {
     return new throw('Error al enviar el correo:', error);
   }
   console.log('Correo enviado:', info.response);
 });
}
}
}


En este caso, el campo html contiene el contenido del correo en formato HTML.


Adjuntar archivos


Otra funcionalidad interesante de Nodemailer es la posibilidad de adjuntar archivos al correo electrónico. Puedes adjuntar imágenes, documentos, archivos comprimidos, entre otros (Los tamaños y tipos dependen de la configuración del servidor de correo).


Otra funcionalidad interesante de Nodemailer es la posibilidad de adjuntar archivos al correo electrónico. Puedes adjuntar imágenes, documentos PDF, archivos ZIP, entre otros.

const send = () => {
   let mailOptions = {
       from: 'tucorreo@gmail.com',
       to: 'destinatario@example.com', 
       subject: 'Hola desde Encodebiz', 
       html: this.generateHtmlTemplate({user:'Jhon Doe'}),
      attachments: [
         {
           filename: 'ejemplo.pdf',
           path: './archivos/ejemplo.pdf' // Ruta local del archivo
        }
     ]
   };

transporter.sendMail(mailOptions, (error, info) => {
   if (error) {
     return new throw('Error al enviar el correo:', error);
   }
   console.log('Correo enviado:', info.response);
 });
}
}
}


En este ejemplo, el campo attachments contiene un arreglo con los archivos que deseas adjuntar. El campo path indica la ubicación del archivo en tu sistema.


Conclusión

Nodemailer es una herramienta poderosa y flexible para enviar correos electrónicos desde aplicaciones Node.js. Con su API intuitiva, puedes implementar rápidamente funcionalidades como el envío de correos simples, correos con HTML, archivos adjuntos y plantillas personalizadas, se puede integrar con el gestor de plantillas Handlebars. También se puede usar con otras tecnologías de compilación en el servidor como NextJS

Recuerda siempre seguir las mejores prácticas de seguridad, especialmente al manejar credenciales y datos sensibles. Además, considera usar servicios de correo dedicados como SendGrid o Amazon SES para mejorar la entrega y evitar problemas con proveedores como Gmail.

Compartir