Листи, відправлені з сайту, потрапляють до спаму? Клієнти не отримують сповіщення про замовлення? Знайома ситуація. Найчастіше причина — неправильне налаштування SMTP-сервера або відсутність SPF/DKIM записів. Ми, команда веб-розробників з багаторічним досвідом, щодня стикаємося з такими проблемами. У цій статті розберемо, як налаштувати відправку email через SMTP за допомогою Nodemailer — це повноцінне налаштування SMTP сервера, організувати пул з'єднань для високого навантаження та уникнути проблем з доставкою. Налаштування під ключ займає від 1 до 5 днів залежно від складності. Якщо хочете отримати готове рішення — зв'яжіться з нами, оцінимо проєкт безкоштовно.
Ось покроковий план налаштування:
- Обрати SMTP-провайдера.
- Налаштувати DNS-записи (SPF, DKIM, DMARC).
- Встановити Nodemailer і створити транспорт.
- Додати пул з'єднань для високого навантаження.
- Налаштувати чергу Bull з retry-логікою.
- Протестувати доставку через Mailtrap або Ethereal.
- Перейти в продакшн та моніторити доставку.
Чому листи потрапляють до спаму?
Основних причин три. Перша — відсутність SPF (Sender Policy Framework) запису в DNS: SMTP-сервер не авторизований відправляти листи від вашого домену. Друга — погана репутація IP-адреси, з якої йде розсилка. Третя — неправильні заголовки листа (відсутня DKIM-підпис, неправильний From). Навіть якщо ви використовуєте безкоштовний SMTP (Gmail, Yandex), необхідно налаштувати ці три компоненти. Інакше листи гарантовано потрапляють до Promotions або спаму.
Як ми налаштовуємо SMTP: кейс з нашої практики
Нещодавно з нашої практики: налаштовували відправку для інтернет-магазину — це кейс нашого клієнта, з 10 000 транзакційних листів на день: підтвердження замовлень, рахунки, статуси доставки. Використовували SMTP-релей Mailgun з наступними параметрами:
- Пул з'єднань: 5 паралельних, 100 листів на конект
- Черга на Bull з retry-логікою: 3 спроби із затримкою 30 секунд
- Повний набір DNS-записів: SPF, DKIM, DMARC (політика quarantine)
- Моніторинг bounced листів через вебхуки Mailgun
Результат: доставка в Inbox — 99,2% (проти 40% до налаштування). Витрати на відправку знизилися на 30% (близько 2000 грн/міс). Досвід показав, що правильна конфігурація SMTP окупається вже в перший місяць.
Яку технологію обрати: Nodemailer vs сторонні SDK?
Nodemailer виграє в 2-3 рази за швидкістю впровадження: одна бібліотека покриває всі популярні SMTP-сервери. SDK від SendGrid або Mailgun прив'язують вас до одного провайдера. Для гнучкості використовуємо Nodemailer + Bull для черги. А пул з'єднань підвищує пропускну здатність у 5 разів порівняно з одним з'єднанням.
Відправка через Nodemailer та пул з'єднань
npm install nodemailer npm install -D @types/nodemailer import nodemailer from 'nodemailer'; const transporter = nodemailer.createTransport({ host: process.env.SMTP_HOST, // smtp.gmail.com, smtp.yandex.ru, etc. port: Number(process.env.SMTP_PORT ?? 465), secure: true, // true для 465, false для 587 auth: { user: process.env.SMTP_USER, pass: process.env.SMTP_PASS, }, // Для корпоративних SMTP з self-signed сертифікатами tls: { rejectUnauthorized: process.env.NODE_ENV === 'production', }, }); // Перевірка з'єднання при старті сервера await transporter.verify(); console.log('SMTP ready'); Відправка листа
async function sendEmail(params: { to: string | string[]; subject: string; html: string; text?: string; attachments?: nodemailer.Attachment[]; }) { const info = await transporter.sendMail({ from: `"Acme Support" <[email protected]>`, to: params.to, subject: params.subject, html: params.html, text: params.text, attachments: params.attachments, headers: { 'X-Mailer': 'Acme App v2', }, }); return info.messageId; } // Приклад з PDF-вкладенням await sendEmail({ to: '[email protected]', subject: 'Ваш інвойс #INV-00042', html: invoiceHtml, attachments: [ { filename: 'invoice-00042.pdf', content: pdfBuffer, contentType: 'application/pdf', }, ], }); Пул з'єднань для високого навантаження
При великій кількості листів створюємо pool замість одного транспорту:
const poolTransporter = nodemailer.createTransport({ pool: true, maxConnections: 5, // паралельних з'єднань maxMessages: 100, // листів на з'єднання до перепідключення host: process.env.SMTP_HOST, port: 465, secure: true, auth: { user: process.env.SMTP_USER, pass: process.env.SMTP_PASS }, }); Як налаштувати DNS-записи для доставки?
| Тип запису | Приклад | Призначення |
|---|---|---|
| SPF | v=spf1 include:mailgun.org ~all | Дозволяє SMTP-серверу відправляти пошту від домену |
| DKIM | Селектор default._domainkey з публічним ключем | Підпис листа, що підтверджує домен відправника |
| DMARC | v=DMARC1; p=quarantine; rua=mailto:[email protected] | Політика обробки листів, що не пройшли SPF/DKIM |
Популярні SMTP-провайдери
| Провайдер | SMTP host | Port | Ліміт |
|---|---|---|---|
| Gmail | smtp.gmail.com | 465/587 | 500/день |
| Yandex | smtp.yandex.ru | 465 | 500/день |
| Mail.ru | smtp.mail.ru | 465 | 500/день |
| Mailgun | smtp.mailgun.org | 587 | за тарифом |
| Brevo | smtp-relay.brevo.com | 587 | 300/день free |
Тестування в dev-режимі
У розробці зручно використовувати Mailtrap або Ethereal — підроблені SMTP-сервери, які перехоплюють листи та показують їх у веб-інтерфейсі:
// Ethereal для локального тесту if (process.env.NODE_ENV !== 'production') { const testAccount = await nodemailer.createTestAccount(); transporter = nodemailer.createTransport({ host: 'smtp.ethereal.email', port: 587, auth: { user: testAccount.user, pass: testAccount.pass, }, }); } Типові помилки при налаштуванні SMTP
- Не налаштовані SPF/DKIM/DMARC — листи потрапляють до спаму
- Використання безкоштовних SMTP для комерційних розсилок — швидке блокування
- Відсутність пулу з'єднань при навантаженні >1000 листів/день — втрата листів
- Ігнорування bounced-сповіщень — падіння репутації
- Відправка з неправильного From — листи відхиляються
Що входить у налаштування під ключ
- Аудит поточної поштової конфігурації
- Вибір оптимального SMTP-провайдера
- Налаштування DNS: SPF, DKIM, DMARC
- Інтеграція Nodemailer з пулом та чергою (Bull)
- Налаштування моніторингу bounced та вебхуків
- Документація з експлуатації
- Навчання команди (1 година онлайн-консультації)
- Гарантія доставки 99% + підтримка 2 тижні
Строки
Налаштування Nodemailer + SMTP + тест-середовище — півдня. З чергою на Bull та retry-логікою — 1 день. Повний цикл (аналітика → проєктування → реалізація → тест → деплой) — від 1 до 5 днів залежно від обсягу трафіку. Наша компанія має 10+ років досвіду, реалізувала 200+ проєктів, на ринку з 2016 року. Якщо у вас виникли питання щодо налаштування SMTP, зв'яжіться з нами — ми допоможемо. Оцінимо проєкт безкоштовно.







