Envio de Email em TypeScript: do simples ao complexo
O envio de emails é uma das funções principais de qualquer aplicação web: registro de usuários, redefinição de senha, notificações de pedidos, newsletters. No ecossistema TypeScript (e Node.js), existem várias bibliotecas poderosas que permitem configurar o envio de emails de forma flexível. Neste artigo, vamos analisar três ferramentas populares: nodemailer, @sendgrid/mail e mailgun.js, mostrar exemplos de código em TypeScript, discutir o trabalho seguro com SMTP e a criação de templates.
1. nodemailer — cliente SMTP universal
nodemailer é a biblioteca mais popular para envio de emails a partir do Node.js. Ela suporta qualquer servidor SMTP (Gmail, Yandex, Mail.ru, servidor de email próprio), além de transportadores integrados para serviços populares. Funciona "pronto para uso" com TypeScript graças à presença de tipos.
Instalação
npm install nodemailernpm install @types/nodemailer --save-devExemplo básico de envio via 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('Email enviado:', info.messageId);}
// UsosendEmail({ to: 'user@example.com', subject: 'Olá do TypeScript!', text: 'Este é um email de teste.', html: '<h1>Olá!</h1><p>Esta é a versão <strong>HTML</strong>.</p>',}).catch(console.error);Trabalhando com múltiplos destinatários e anexos
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: '"Equipe" <no-reply@mydomain.ru>', to: ['user1@example.com', 'user2@example.com'], subject: 'Relatório mensal', text: 'Em anexo o arquivo com o relatório.', attachments: [ { filename: 'report.pdf', path: './docs/report.pdf', }, ], });}2. SendGrid — serviço em nuvem para grandes volumes
SendGrid (parte da Twilio) é uma plataforma profissional para envio de emails. Ela fornece API, SDK para Node.js/TypeScript, análise de entrega e proteção contra spam. É recomendada para projetos com alta carga (milhares de emails por dia).
Instalação e configuração
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('Email enviado via SendGrid'); } catch (error) { console.error('Erro no SendGrid:', error); throw error; }}3. Mailgun — alternativa para desenvolvedores
Mailgun é outro serviço popular com REST API e compatibilidade com TypeScript