Відправка email з сайту: як налаштувати SMTP-сервер без спаму

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Відправка email з сайту: як налаштувати SMTP-сервер без спаму
Простий
від 4 годин до 2 днів
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1362
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1253
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    958
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1190
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    932
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    949

Листи, відправлені з сайту, потрапляють до спаму? Клієнти не отримують сповіщення про замовлення? Знайома ситуація. Найчастіше причина — неправильне налаштування SMTP-сервера або відсутність SPF/DKIM записів. Ми, команда веб-розробників з багаторічним досвідом, щодня стикаємося з такими проблемами. У цій статті розберемо, як налаштувати відправку email через SMTP за допомогою Nodemailer — це повноцінне налаштування SMTP сервера, організувати пул з'єднань для високого навантаження та уникнути проблем з доставкою. Налаштування під ключ займає від 1 до 5 днів залежно від складності. Якщо хочете отримати готове рішення — зв'яжіться з нами, оцінимо проєкт безкоштовно.

Ось покроковий план налаштування:

  1. Обрати SMTP-провайдера.
  2. Налаштувати DNS-записи (SPF, DKIM, DMARC).
  3. Встановити Nodemailer і створити транспорт.
  4. Додати пул з'єднань для високого навантаження.
  5. Налаштувати чергу Bull з retry-логікою.
  6. Протестувати доставку через Mailtrap або Ethereal.
  7. Перейти в продакшн та моніторити доставку.

Чому листи потрапляють до спаму?

Основних причин три. Перша — відсутність 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, зв'яжіться з нами — ми допоможемо. Оцінимо проєкт безкоштовно.

Інтеграція email розсилок: чому вона часто ламається?

Ми стикалися з тим, що тригерний лист через 10 хвилин після реєстрації конвертує в 4–5 разів краще, ніж той самий лист через 24 години. Це не маркетинговий міф — це механіка: поки користувач теплий, поки пам'ятає контекст. Але більшість інтеграцій з розсильниками зроблені так: форма сабмітиться → синхронний HTTP-запит до API → якщо API гальмує, користувач чекає 3 секунди → лист йде або не йде, ніхто не знає.

Якщо ви зіткнулися з втраченими листами або потраплянням у спам, замовте аудит існуючої інтеграції — ми знайдемо вузькі місця за 2 дні.

Провайдери та їх API

Unisender — російський провайдер, популярний у сегменті SMB. REST API, простий. Додавання контакту: importContacts, відправка транзакційного листа: sendEmail. Важливо: для транзакційних листів (підтвердження замовлення, скидання пароля) Unisender Go — окремий сервіс з іншим API та окремою ціною. Змішувати масові розсилки та транзакційні в одному потоці — погана ідея для репутації домену.

SendPulse — надає email, SMS, web push, Viber, Telegram-боти через єдиний API. Для проєктів, де потрібен омніканал, це зручно. Automation 360 — візуальний конструктор ланцюжків, можна запустити автоматизацію через API event. SDK для PHP (sendpulse/rest-api-php-sdk) підтримується, але оновлюється нерегулярно — краще використовувати напряму через Guzzle.

Mailchimp — вибір для міжнародної аудиторії та маркетингових команд, звиклих до екосистеми Mailchimp. Transactional email — через Mandrill (дочірній сервіс). Marketing API v3 для управління списками, тегами, кампаніями. Webhook для подій: відкриття, клік, відписка, bounce.

SMS. Для Росії: СМСЦ, МТС Exolve, Devino Telecom, SMS Aero. API у всіх схожий: метод send, параметри phone, message, sender (ім'я відправника — потрібно реєструвати окремо у оператора). Один нюанс: ім'я відправника має бути зареєстровано через агрегатора з договором — без цього SMS не відправляться на мережі МТС/МегаФон/Білайн.

Провайдер Тип Транзакційні листи Маркетингові Особливості
Unisender email+SMS Unisender Go (окремо) так Популярний в РФ, простий REST
SendPulse email+SMS+web push+Viber так так Єдиний API, омніканальність
Mailchimp email Mandrill так Аналітика, міжнародний
Twilio SMS+email так ні Глобальний, дорогий в РФ

Як побудувати інтеграцію, щоб не втрачати листи?

Розділяємо транзакційні та маркетингові потоки

Транзакційні листи (підтвердження замовлення, скидання пароля, статус доставки) — через окремий домен-відправник або субдомен tx.example.com. Маркетингові розсилки — через mail.example.com або news.example.com. Якщо маркетингова розсилка отримає багато скарг на спам, це не повинно зачепити репутацію транзакційного потоку. Згідно з документацією SendGrid, транзакційні повідомлення слід відправляти через виділений IP-пул для запобігання перехресному впливу.

Черга та retry

Будь-який виклик до email API — через чергу (Laravel Queue, Bull, Celery). Якщо Unisender повернув 503 — задача йде в retry через 5 хвилин, потім 15, потім 60. Після 5 невдалих спроб — у dead letter queue з алертом. Користувач при цьому вже отримав свій 200 OK і не знає про проблему. Завдяки цьому підходу bounce rate на проєктах знижується до 0.5%.

Приклад job для Laravel:

public function handle(): void
{
    try {
        $response = Http::post(config('services.unisender.email_url'), $this->params);
        if ($response->failed()) {
            $this->release(300); // retry через 5 хв
        }
    } catch (\Throwable $e) {
        $this->release(300);
    }
}

Шаблони

Зберігаємо шаблони в коді (Blade, Twig, React Email), не в інтерфейсі провайдера. Причини: версіонування через Git, preview у браузері без відправки, можливість тестування. Для складних шаблонів з динамічним контентом — react-email з експортом в HTML через @react-email/render.

Валідація та згоди

Перед додаванням контакту до списку — double opt-in (лист з підтвердженням). Зберігати факт підтвердження з timestamp у своїй БД. При відписці — синхронно відписуємо і у провайдера, і в своїй базі. Ігнорувати webhook відписки — прямий шлях до блокування акаунта у провайдера. Всі процеси відповідають ФЗ-152 про персональні дані.

Як налаштувати DKIM для домену-відправника?

DKIM дозволяє підписувати листи цифровим підписом, що підвищує довіру поштових серверів.

  1. Згенеруйте пару ключів (наприклад, через OpenSSL: openssl genrsa -out private.key 2048).
  2. Опублікуйте публічний ключ у DNS як TXT-запис для селектора (наприклад, mail._domainkey.tx.example.com).
  3. Вкажіть селектор у провайдера (SendGrid, Mailgun, Unisender).
  4. Перевірте командою dig TXT mail._domainkey.tx.example.com.

Моніторинг доставності

Підключаємо webhook від провайдера на події bounce (жорсткий і м'який), spam_complaint, unsubscribe. Жорсткий bounce — негайно позначаємо email як невалідний у своїй БД, більше не відправляємо. М'який bounce 3 рази поспіль — те саме. Метрики: open rate, click rate, bounce rate, unsubscribe rate — дивимося не рідше разу на тиждень. Наші сертифіковані інженери налаштовують алерти в Grafana/Prometheus.

Чому важливо розділяти потоки?

Якщо відправити маркетингову розсилку з того ж домену, що й транзакційні листи, отримавши скарги на спам, ви ризикуєте заблокувати домен — і користувачі перестануть отримувати навіть підтвердження замовлень. SPF, DKIM, DMARC (Wikipedia SPF, Wikipedia DKIM) повинні бути налаштовані окремо для кожного потоку. Ми використовуємо субдомени з різними DNS-записами.

Обсяг робіт з інтеграції

  • Аудит поточних потоків комунікації та репутації домену (SPF, DKIM, DMARC)
  • Вибір провайдера та схеми: транзакційний vs маркетинговий трафік
  • Налаштування DNS-записів SPF, DKIM, DMARC (Wikipedia DMARC)
  • Розробка шаблонів листів (HTML + динамічний контент)
  • Інтеграція з бекендом через черги та API
  • Налаштування webhook для доставності та скарг
  • Документація з експлуатації та навчання команди
  • Гарантія доставності та підтримка після запуску

Терміни та вартість

Сценарій Термін (робочі дні) Примітка
Базові транзакційні листи (один провайдер) 5–7 днів Ціна розраховується індивідуально після аудиту
Тригерні ланцюжки + SMS + веб-пуши 10–20 днів Ціна розраховується індивідуально після аудиту
Повна омніканальна автоматизація 20–40 днів Ціна розраховується індивідуально після аудиту

Вартість розраховується індивідуально після аудиту. Ми працюємо під ключ: від аналізу до моніторингу в продакшені. Отримайте консультацію інженера — оцінимо проєкт безкоштовно та скажемо точні терміни. Досвід більше 7 років в інтеграції поштових сервісів, реалізовано 50+ проєктів. Замовте безкоштовний аудит поточної інтеграції — отримайте звіт з рекомендаціями.