Листи, відправлені з сайту, потрапляють до спаму? Клієнти не отримують сповіщення про замовлення? Знайома ситуація. Найчастіше причина — неправильне налаштування 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, зв'яжіться з нами — ми допоможемо. Оцінимо проєкт безкоштовно.







