Как отправлять email из кода: nodemailer, SMTP и HTML-письма
Подробный гайд по работе с nodemailer: основы SMTP и отправка HTML-писем. Используем шаблонизаторы, добавляем вложения и защищаем данные при отправке.
501 открытий3К показов

Задача кажется простой: взял библиотеку, добавил в приложение — и письма полетели. На практике возникают вопросы:
- Как настроить подключение к SMTP-серверу?
- Что делать, если письма летят в спам?
- Как отправить HTML-письмо, чтобы вёрстку не перекосило?
После прочтения статьи вы научитесь создавать простые текстовые уведомления и HTML-письма с вложениями. Рассмотрим настройку SMTP-провайдера Яндекс, научимся слать письма с персональными вложениями.
Информация пригодится вам, если вы подключаете форму обратной связи или добавляете систему уведомлений. Прежде чем погружаться в практику, вспомним основы — как работает доставка электронной почты.
SMTP — простой протокол передачи email
По протоколу SMTP почтовые серверы «договариваются» о передаче писем от отправителя к получателю. Архитектура проверена десятилетиями: каждый почтовый сервер в мире понимает SMTP. Протокол справляется с миллиардами писем ежедневно, не принадлежит ни одной компании, а новые решения не ломают старые системы.
Как работает SMTP
Принцип работы электронной почты напоминает обычную почтовую службу. Бумажное письмо кладут в конверт, подписывают адрес получателя и опускают в ящик. Дальше почтовая служба разбирается, как доставить письмо до адресата.
В электронной почте происходит нечто похожее:
- Когда написали письмо и нажимаете «Отправить», ваша программа соединяется с SMTP-сервером.
- Сервер проверяет адрес получателя и определяет, куда дальше передавать письмо.
- Письмо путешествует между SMTP-серверами, пока не достигнет сервера получателя.
- Сервер получателя сохраняет письмо в почтовый ящик, откуда адресат может его прочитать.
Начинающие разработчики путают SMTP с другими почтовыми протоколами, хотя они выполняют принципиально разные функции.

SMTP отвечает только за отправку писем. Он работает как «исходящая почта», передавая письма от отправителя к серверу получателя. SMTP используют, когда отправляют письма из приложений.
POP3 и IMAP предназначены только для получения писем. Они работают как «входящая почта» и позволяют клиентам загружать письма с сервера. Разница между ними в том, что POP3 скачивает и удаляет письма с сервера, а IMAP синхронизирует состояние писем между всеми устройствами пользователя.
Основные типы SMTP-серверов
По назначению SMTP-серверы можно разделить на две большие группы:
- Обычные серверы для переписки. Их предоставляют интернет-провайдеры, хостинг-компании и почтовые сервисы. Единственная проблема — лимиты. Можно отправлять не более 100-500 писем в день.
- Специальные серверы для массовых рассылок и автоматических уведомлений от сайтов (например, подтверждение регистрации или чек покупки). Через такие серверы можно отправлять тысячи и даже миллионы писем без риска блокировки.
Выбор зависит от ваших потребностей. Отправлять десятки писем в день можно через бесплатные сервисы: Gmail или Яндекс. Если планируете рассылки из сотен или тысяч писем, обратите внимание на SendGrid, Mailgun, Amazon SES. Они гарантируют защиту от блокировок, но работают по платной подписке.
Можно развернуть почтовый сервер на собственном железе. Этот подход выбирают, когда нельзя доверять переписку даже Яндексу. Назир Наурзоков — инженер по проектным решениям Acer в России — рассказал об особенностях этого решения в статье «Нужен ли вашей компании собственный почтовый сервер».
Установка и настройка nodemailer
Практиковаться будем на бесплатной библиотеке Nodemailer. Через неё можно слать обычный текст и HTML-письма со сложным дизайном, вложенными файлами.
Перед установкой потребуется Node.js версии 8.0.0 или выше:
Если среда Node.js не установлена или устарела, скачайте актуальную версию.
Чтобы загрузить Nodemailer, откройте терминал, перейдите в директорию проекта и выполните команду:
Тестовый скрипт для отправки письма
Не беспокойтесь, если не определились с почтовым сервером. Отправим первое письмо в тестовом режиме — результат видно без реальной отправки.
Создайте новый файл, например send-email.js, и вставьте следующий код:
Запустите скрипт:
В консоли будет сообщение об успешной отправке и ссылка, по которой можно посмотреть, как выглядит ваше письмо. После подключения к реальному SMTP-серверу тестовые сообщения можно слать на личную или временную почту (Temp Mail, Internxt).
Подробнее по теме: Что такое временная почта и как ее использовать.
Отправка простого текстового письма
Код для отправки через SMTP-сервер Яндекса:
В user указываем логин от почты без @yandex.ru, а пароль нужно сгенерировать в Яндекс ID.
Поле from можно указывать в нескольких форматах:
Имя отправителя нужно заключать в кавычки, если оно содержит пробелы или спецсимволы.
Различие между cc и bcc
CC (Carbon Copy) — открытая копия письма. Все получатели видят адреса в поле cc:
BCC (Blind Carbon Copy) — скрытая копия. Получатели в bcc не видны другим адресатам:
Настройка reply-to
Если хотите получать ответы на другой адрес, используйте replyTo:
Создание и отправка HTML-писем
Самый простой способ отправить текст с применением стилей — передать HTML-код в виде строки:
HTML-код реальных писем сложнее, занимает сотни строчек. Поэтому рекомендуется использовать встроенный модуль fs для чтения из файла:
Встраивание изображений
Nodemailer поддерживает 2 способа работы с картинками:
- Ссылки на внешние ресурсы, которые загружаются при открытии письма.
- Встраивание картинки прямо в письмо через параметр attachments с флагом cid.
Встроенные изображения увеличивают размер письма, но спасают от ситуаций, когда источник картинки может быть заблокирован в стране получателя.
Адаптив и совместимость
Вёрстка в почтовых клиентах не работает как в браузерах. Многие CSS-свойства не поддерживаются, JavaScript полностью заблокирован.
HTML-письмо — это большая таблица, которая тоже состоит из таблиц.
Раньше таблицами верстали сайты, потом пришли к flexbox и grid. Электронная почта тоже эволюционирует, но медленно — в HTML-письмах эффективна только табличная вёрстка.
Таблицы корректно отображаться в Gmail, Mail.ru, Outlook и других почтовых клиентах.
Тестирование писем
Для проверки используйте:
- Litmus — платформа для тестирования в 90+ клиентах.
- Email on Acid — альтернатива Litmus.
- Mail Tester — бесплатная проверка на спам.
- Can I Email — таблица поддержки CSS в письмах.
Начинайте с простых шаблонов и постепенно усложняйте. Всегда тестируйте в основных клиентах: Gmail, Outlook и обязательно на мобильных устройствах.
Подключение шаблонов и вложений
Шаблоны нужны, чтобы отправлять персонализированные письма множеству получателей. Вместо создания отдельного HTML для каждого пользователя вручную, один шаблон подставляет имена, данные заказов, списки товаров автоматически.
При отправке 100 писем с приветствием «Привет, Максим!» и уникальными номерами заказов ручное создание HTML превращается в кошмар. Шаблонизатор Handlebars решает эту проблему. Также он упрощает поддержку — изменения в дизайне вносятся в один файл.
Handlebars превращает статичные HTML-шаблоны в динамические письма. Переменные заменяются реальными данными при компиляции.
Handlebars поддерживает условные блоки {{#if}} и циклы {{#each}}. С их помощью можно показывать разные части письма в зависимости от данных или выводить списки товаров, уведомлений, участников.
HTML-шаблоны реального проекта хранятся в отдельной папке. Модуль fs читает файл, Handlebars компилирует его с данными, результат передается в nodemailer. Такой подход разделяет логику приложения и вёрстку писем.
Добавление файлов-вложений
Параметр attachments в nodemailer принимает массив объектов с описанием файлов. Каждое вложение содержит имя файла и путь к нему или буфер с содержимым:
Размер всех вложений не должен превышать лимиты почтового сервера — 25 МБ для Gmail и Outlook.
Генерация файлов на лету
Популярная задача — создание PDF-документов прямо в коде. Библиотека pdfkit генерирует PDF в памяти, результат передается как буфер в nodemailer. Аналогично работают библиотеки для создания Excel-файлов или изображений. Получается персонализированное письмо с документами и красивым оформлением.
Ошибки при отправке писем и их обработка
Ошибки аутентификации встречаются чаще всего. Коды 535 и 534 указывают на проблемы с логином или паролем. Почтовые провайдеры требуют использования паролей приложений вместо основных паролей аккаунтов. Gmail и Яндекс.Почта не позволят войти с обычным паролем, если не включена 2-Fa.
Проблемы с получателями проявляются кодами 550 (пользователь не найден) и 553 (неверный формат email). Ошибка 552 сигнализирует о превышении размера письма.
Реальная система должна различать критические и временные ошибки. Временные проблемы (таймауты, недоступность сервера) требуют повторных попыток с задержкой. Критические ошибки (неверный email, проблемы аутентификации) нужно логировать и обрабатывать немедленно.
Простейший подход — попытки отправки с увеличивающимися интервалами: 2, 4 и 8 секунд.
Как понять, дошло ли письмо?
Nodemailer сообщает только о том, что SMTP-сервер принял письмо для доставки. Это не гарантирует доставку в почтовый ящик получателя.
Фактическая доставка зависит от множества факторов:
- репутации отправителя,
- содержимого письма,
- настроек получателя.
Для отслеживания реальной доставки используют скрытый пиксель — невидимые изображения размером 1×1 px, встроенные в HTML-письма. Когда получатель открывает письмо, изображение загружается с вашего сервера, фиксируя факт прочтения.
Почему письма попадают в спам?
Спам-фильтры анализируют множество факторов. Основные проблемы: отправка с бесплатных почтовых сервисов для бизнес-рассылок, использование спам-слов в теме (“СРОЧНО!!!”, “СКИДКА 90%”).
Технические аспекты:
- отсутствие SPF, DKIM и DMARC записей в DNS;
- неправильно настроенный reverse DNS;
- высокий процент отказов (bounce rate) в предыдущих рассылках.
Хотите улучшить доставляемость? Добавьте ссылку для отписки, поддерживайте чистоту списков рассылки и наращивайте объем писем постепенно.
Безопасность при отправке писем
Первое правило: никогда не храните пароли прямо в коде. Даже если это тестовый проект, который никто не увидит. Используйте переменные окружения.
Создайте файл .env в корне проекта:
Не забудьте добавить .env в .gitignore. В коде обращайтесь к этим переменным через process.env:
OAuth2 и пароли приложений
Если работаете с Gmail, Яндексом или другими крупными почтовыми сервисами, забудьте про обычные пароли. Используйте OAuth2 или пароли для приложений:
- Пароли приложений работают только для конкретной задачи, их можно в любой момент отозвать.
- OAuth2 — более сложный, но безопасный способ.
Подробнее по теме: OAuth 2.0 и OIDC: как защитить API и пользовательские данные.
SPF, DKIM, DMARC
Это записи в DNS, которые говорят почтовым серверам: «Да, это письмо действительно от нас, а не от мошенников»:
- SPF — список IP-адресов, с которых можно отправлять письма от вашего домена.
- DKIM — цифровая подпись письма.
- DMARC — политика обработки писем, которые не прошли проверку.
Если используете свой домен, настройте эти записи. Если нет — не переживайте, это задача для более продвинутого уровня.
Что дальше?
Следующий шаг — автоматизация рассылок. Когда пользователь регистрируется, система отправляет приветственное письмо, при оформлении заказа — подтверждение с деталями покупки.
Для больших объёмов писем понадобятся SendGrid, Mailgun и Amazon SES. Эти сервисы решают проблемы с доставляемостью и предоставляют статистику — сколько писем доставлено, открыто, по каким ссылкам кликнули получатели.
Персонализация выходит за рамки подстановки имени в шаблон. Анализ поведения пользователей позволяет отправлять релевантный контент — подборки товаров на основе предыдущих покупок, напоминания о брошенной корзине.
Тестирование email-кампаний помогает улучшить результаты. A/B-тесты показывают, какие заголовки чаще открывают, эксперименты с временем отправки выявляют оптимальные часы для конкретной аудитории.
Интеграция с аналитикой замыкает цикл. UTM-метки в ссылках письма показывают в Google Analytics, сколько пользователей перешло из рассылки на сайт и что там делали. Эти данные помогают оценить эффективность email-маркетинга и планировать следующие кампании.
501 открытий3К показов