Отправка email на TypeScript: библиотеки и примеры кода

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

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

Начать курс

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

TypeScript — это строго типизированное надмножество JavaScript, которое активно используется в современных веб-приложениях. Отправка email — одна из ключевых задач для бэкенда, уведомлений и маркетинга. В этой статье мы подробно разберём несколько библиотек для отправки email на TypeScript, включая настройку, отправку простых и HTML-писем, а также работу с вложениями.

Почему TypeScript для отправки email?

TypeScript добавляет типизацию, что снижает количество ошибок на этапе разработки. При отправке email это особенно важно: правильные типы для SMTP-хоста, порта, учётных данных и опций письма помогают избежать runtime-ошибок. Кроме того, TypeScript поддерживает современные async/await конструкции, что делает код чище и понятнее.

Основные библиотеки для отправки email на TypeScript

  • nodemailer — самая популярная библиотека для Node.js, полностью совместима с TypeScript. Поддерживает SMTP, Sendmail, вложения, HTML-шаблоны.
  • @sendgrid/mail — официальный клиент SendGrid для Node.js с TypeScript-типами. Использует API SendGrid, не требует SMTP.
  • aws-sdk (SES) — Amazon Simple Email Service. Мощное решение для массовых рассылок, интеграция с AWS.
  • emailjs — лёгкая библиотека с поддержкой TypeScript, но менее популярна.

Установка и настройка nodemailer с TypeScript

Установите пакеты через npm:

npm install nodemailer
npm install @types/nodemailer --save-dev

Базовый пример отправки email через SMTP (Gmail, Yandex, Mail.ru и т.д.):

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({
    host: 'smtp.gmail.com',
    port: 587,
    secure: false, // true для 465 порта
    auth: {
      user: 'your-email@gmail.com',
      pass: 'your-password-or-app-password',
    },
  });

  const mailOptions = {
    from: '"Ваше имя" <your-email@gmail.com>',
    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!',
  html: '<h1>Проверка</h1><p>Это HTML-письмо.</p>',
});

Важно: Для Gmail включите "Доступ к ненадёжным приложениям" или используйте пароль приложения (App Password). Для продакшена лучше использовать OAuth2.

Отправка email через SendGrid на TypeScript

SendGrid предоставляет готовый API, не требующий SMTP. Установка:

npm install @sendgrid/mail

Пример отправки:

import sgMail from '@sendgrid/mail';

sgMail.setApiKey('YOUR_SENDGRID_API_KEY');

interface SendGridMessage {
  to: string;
  from: string;
  subject: string;
  html: string;
}

async function sendWithSendGrid(message: SendGridMessage): Promise<void> {
  try {
    await sgMail.send(message);
    console.log('Email отправлен через SendGrid');
  } catch (error) {
    console.error('Ошибка отправки:', error);
  }
}

sendWithSendGrid({
  to: 'user@example.com',
  from: 'sender@yourdomain.com',
  subject: 'Тест SendGrid + TypeScript',
  html: '<p>Это сообщение отправлено через SendGrid API.</p>',
});

Отправка email с вложениями на TypeScript

nodemailer поддерживает вложения любого типа. Пример с PDF-файлом:

import nodemailer from 'nodemailer';
import path from 'path';

async function sendWithAttachment() {
  const transporter = nodemailer.createTransport({ /* настройки SMTP */ });

  await transporter.sendMail({
    from: 'sender@example.com',
    to: 'recipient@example.com',
    subject: 'Письмо с вложением',
    text: 'См. прикреплённый файл.',
    attachments: [
      {
        filename: 'report.pdf',
        path: path.join(__dirname, 'files', 'report.pdf'),
        contentType: 'application/pdf',
      },
      {
        filename: 'image.png',
        content: Buffer.from('iVBORw0KGgo...', 'base64'), // или из файла
        encoding: 'base64',
      },
    ],
  });
}

Использование шаблонов писем в TypeScript

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