Email отправка на TypeScript: от простого к сложному
Отправка электронных писем — одна из ключевых функций любого веб-приложения: регистрация пользователей, сброс пароля, уведомления о заказах, рассылки новостей. В экосистеме TypeScript (и Node.js) существует несколько мощных библиотек, которые позволяют гибко настроить email-рассылку. В этой статье мы разберём три популярных инструмента: nodemailer, @sendgrid/mail и mailgun.js, покажем примеры кода на TypeScript, обсудим безопасную работу с SMTP и шаблонизацию.
1. nodemailer — универсальный SMTP-клиент
nodemailer — самая популярная библиотека для отправки писем из Node.js. Она поддерживает любые SMTP-серверы (Gmail, Yandex, Mail.ru, собственный почтовый сервер), а также встроенные транспортеры для популярных сервисов. Работает «из коробки» с TypeScript благодаря наличию типов.
Установка
npm install nodemailer
npm install @types/nodemailer --save-dev
Базовый пример отправки через 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('Письмо отправлено:', info.messageId);
}
// Использование
sendEmail({
to: 'user@example.com',
subject: 'Привет из TypeScript!',
text: 'Это тестовое письмо.',
html: '<h1>Привет!</h1><p>Это <strong>HTML</strong> версия.</p>',
}).catch(console.error);
Работа с несколькими получателями и вложениями
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: '"Команда" <no-reply@mydomain.ru>',
to: ['user1@example.com', 'user2@example.com'],
subject: 'Отчёт за месяц',
text: 'Во вложении файл с отчётом.',
attachments: [
{
filename: 'report.pdf',
path: './docs/report.pdf',
},
],
});
}
2. SendGrid — облачный сервис для больших объёмов
SendGrid (часть Twilio) — профессиональная платформа для email-рассылок. Она предоставляет API, SDK для Node.js/TypeScript, аналитику доставки и защиту от спама. Рекомендуется для проектов с высокой нагрузкой (тысячи писем в день).
Установка и настройка
npm install @sendgrid/mail
import 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('Письмо отправлено через SendGrid');
} catch (error) {
console.error('Ошибка SendGrid:', error);
throw error;
}
}
3. Mailgun — альтернатива для разработчиков
Mailgun — ещё один популярный сервис с REST API и TypeScript-совместимым SDK. Отличается гибкой маршрутизацией, шаблонами и аналитикой.
Пример с mailgun.js
import Mailgun from 'mailgun.js';
import formData from 'form-data';
const mailgun = new Mailgun(formData);
const mg = mailgun.client({
username: 'api',
key: process.env.MAILGUN_API_KEY!,
});
async function sendViaMailgun() {
const result = await mg.messages.create('mydomain.com', {
from: 'Mailgun Sandbox <postmaster@sandbox.mydomain.com>',
to: ['user@example.com'],
subject: 'Hello from Mailgun',
text: Также в библиотеке
Работа с датами в Swift: Foundation, SwiftDate, DateTools (iOS/macOS)
Реактивное программирование в Rust: библиотеки, фреймворки и практические примеры