Envío de correo electrónico en TypeScript: de lo simple a lo complejo
El envío de correos electrónicos es una de las funciones clave de cualquier aplicación web: registro de usuarios, restablecimiento de contraseñas, notificaciones de pedidos, boletines de noticias. En el ecosistema de TypeScript (y Node.js) existen varias librerías potentes que permiten configurar de forma flexible el envío de correos. En este artículo analizaremos tres herramientas populares: nodemailer, @sendgrid/mail y mailgun.js, mostraremos ejemplos de código en TypeScript, discutiremos el trabajo seguro con SMTP y la creación de plantillas.
1. nodemailer — cliente SMTP universal
nodemailer es la librería más popular para enviar correos desde Node.js. Soporta cualquier servidor SMTP (Gmail, Yandex, Mail.ru, servidor de correo propio), así como transportadores integrados para servicios populares. Funciona "de fábrica" con TypeScript gracias a la disponibilidad de tipos.
Instalación
npm install nodemailernpm install @types/nodemailer --save-devEjemplo básico de envío a través de Gmail SMTP
import nodemailer from 'nodemailer';
interface EmailOptions { to: string; subject: string; text: string; html?: string;}
async function sendEmail(options: EmailOptions): Promise<void> { const transporter = nodemailer.createTransport({ service: 'gmail', auth: { user: process.env.EMAIL_USER, pass: process.env.EMAIL_PASS, }, });
const mailOptions = { from: `"My App" <${process.env.EMAIL_USER}>`, to: options.to, subject: options.subject, text: options.text, html: options.html, };
const info = await transporter.sendMail(mailOptions); console.log('Correo enviado:', info.messageId);}
// UsosendEmail({ to: 'user@example.com', subject: '¡Hola desde TypeScript!', text: 'Este es un correo de prueba.', html: '<h1>¡Hola!</h1><p>Esta es la versión <strong>HTML</strong>.</p>',}).catch(console.error);Trabajo con múltiples destinatarios y archivos adjuntos
async function sendBulkWithAttachments(): Promise<void> { const transporter = nodemailer.createTransport({ host: 'smtp.yandex.ru', port: 465, secure: true, auth: { user: process.env.YANDEX_USER, pass: process.env.YANDEX_PASS, }, });
await transporter.sendMail({ from: '"Equipo" <no-reply@mydomain.ru>', to: ['user1@example.com', 'user2@example.com'], subject: 'Informe mensual', text: 'Se adjunta el archivo con el informe.', attachments: [ { filename: 'report.pdf', path: './docs/report.pdf', }, ], });}2. SendGrid — servicio en la nube para grandes volúmenes
SendGrid (parte de Twilio) es una plataforma profesional para envíos de correo electrónico. Proporciona API, SDK para Node.js/TypeScript, análisis de entrega y protección contra spam. Se recomienda para proyectos con alta carga (miles de correos al día).
Instalación y configuración
npm install @sendgrid/mailimport sgMail from '@sendgrid/mail';
sgMail.setApiKey(process.env.SENDGRID_API_KEY!);
interface SendGridOptions { to: string | string[]; subject: string; html: string; from?: string;}
async function sendViaSendGrid(options: SendGridOptions): Promise<void> { const msg = { to: options.to, from: options.from || 'noreply@mydomain.com', subject: options.subject, html: options.html, };
try { await sgMail.send(msg); console.log('Correo enviado a través de SendGrid'); } catch (error) { console.error('Error de SendGrid:', error); throw error; }}3. Mailgun — alternativa para desarrolladores
Mailgun es otro servicio popular con API REST y compatibilidad con TypeScript