Email отправка на TypeScript: полное руководство с nodemailer и SMTP

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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:                    

Рекомендаций