Транзакционные письма — это «подтвердите email», «ваш заказ оформлен», «сброс пароля», «инвойс на оплату». Доставляться они должны почти со 100% надёжностью и быстро (секунды, не минуты). Свой SMTP-сервер на VPS — путь в спам-фолдер за неделю. Нужен специализированный сервис.
В 2026 для проектов в России выбор сильно сузился — разбираем, что реально работает.
Что такое транзакционная почта
Не путать с маркетинговыми рассылками:
| Тип | Транзакционная | Маркетинговая |
|---|---|---|
| Когда отправляется | по событию пользователя | по расписанию |
| Получатель | один конкретный | сегмент / база |
| Согласие | вытекает из действия (заказ, регистрация) | явный opt-in |
| Объём | от 100 до миллионов /день | пакетами |
| Сервис | Postmark, SES, SendGrid | Mailchimp, Unisender Pro |
Мы говорим про первое — серверные триггерные письма от вашего приложения.
Почему не свой SMTP
Технически — пожалуйста. На практике:
- Ваш VPS-IP не имеет «репутации». Gmail/Mail.ru сразу шлёт в спам.
- Нужно настраивать SPF, DKIM, DMARC, обратные DNS, IP warmup.
- Нет дашборда: не видите, доставилось или нет.
- Один спам-репорт от пользователя — IP в blacklist.
- Проблемы с TLS, сертификатами, очередью при сбоях.
Через час такой работы понимаете: $20-50/мес за специализированный сервис того стоят.
Сравнение сервисов
| Сервис | Российский | Цена за 100k писем | Доставляемость в РФ | API |
|---|---|---|---|---|
| Amazon SES | нет | $10 | средняя (часть IP в блоке Mail.ru) | хорошее |
| Mailgun | нет | $35 | хорошая | отличное |
| SendGrid | нет | $50-90 | хорошая | хорошее |
| Postmark | нет | $50 | отличная | отличное |
| Resend | нет | $20 | отличная (для не-РФ) | топ |
| Unisender Go | да (РФ) | ~600 ₽ | отличная для РФ | хорошее |
| SendPulse | да (Беларусь) | ~500 ₽ | хорошая | хорошее |
| Yandex 360 SMTP | да | бесплатно до 200/день | хорошая для Yandex.ru | базовое |
Для российских адресов почты (yandex.ru, mail.ru, rambler.ru) лучше всего работают российские сервисы — они аккредитованы Mail.ru Group и Яндексом.
Unisender Go (раньше — UniOne)
Российский сервис, специализируется на транзакционных письмах. Поддерживает SMTP и REST API.
const res = await fetch("https://go1.unisender.ru/ru/transactional/api/v1/email/send.json", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-KEY": process.env.UNISENDER_API_KEY!,
},
body: JSON.stringify({
message: {
from_email: "noreply@example.ru",
from_name: "Магазин",
subject: "Заказ #1234 оформлен",
body: { html: "<h1>Спасибо!</h1>" },
recipients: [{ email: user.email, substitutions: { name: user.name } }],
},
}),
});
Цена: 0.07-0.10 ₽ за письмо для небольших объёмов. Дашборд с метриками доставляемости, открываемости, отписок.
Amazon SES
Дешевле всех — $0.10 за 1000 писем. Но:
- Для прода нужен выход из sandbox (запрос в саппорт).
- Российские провайдеры иногда блокируют целые AWS-IP-диапазоны.
- Биллинг — иностранная карта.
В 2026 SES работает технически, но оплата для российской компании сложна. Если у вас аккаунт в зарубежной юрисдикции — отличный выбор.
import { SES } from "@aws-sdk/client-ses";
const ses = new SES({ region: "eu-central-1" });
await ses.sendEmail({
Source: "noreply@example.com",
Destination: { ToAddresses: ["user@example.com"] },
Message: {
Subject: { Data: "Hello" },
Body: { Html: { Data: "<p>Hi!</p>" } },
},
});
Yandex 360 для бизнеса
Если у вас домен на Yandex Connect, можно слать через Yandex SMTP. Бесплатно до 200 писем в сутки на ящик. Подходит для маленьких сайтов с десятком уведомлений в день — заявки с лендинга, восстановление пароля.
SMTP_HOST=smtp.yandex.ru
SMTP_PORT=465
SMTP_USER=noreply@example.ru
SMTP_PASS=app-password
Через nodemailer:
import nodemailer from "nodemailer";
const t = nodemailer.createTransport({
host: "smtp.yandex.ru",
port: 465,
secure: true,
auth: { user, pass },
});
await t.sendMail({ from: user, to, subject, html });
SPF, DKIM, DMARC
Без этих DNS-записей письма уходят в спам.
SPF — TXT-запись на корневом домене:
v=spf1 include:_spf.unisender.ru include:_spf.yandex.net -all
DKIM — публичный ключ подписи. Сервис даёт вам строку, кладёте в DNS:
selector1._domainkey.example.ru TXT v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBA...
DMARC — политика, что делать с письмами, не прошедшими SPF/DKIM:
_dmarc.example.ru TXT v=DMARC1; p=quarantine; rua=mailto:dmarc@example.ru
Без всех трёх Mail.ru шлёт ваши письма в спам с большой вероятностью. Проверка: mail-tester.com — отправляете тестовое письмо, получаете оценку 0-10. Цельтесь в 9-10.
Шаблоны
Не лепите HTML строкой в коде. Варианты:
- MJML — простой DSL, компилируется в кросс-клиентский HTML.
- react-email — компоненты на React, рендеринг в HTML.
- Maizzle — Tailwind для писем.
// react-email
import { Html, Button } from "@react-email/components";
export function OrderConfirmed({ orderId, total }) {
return (
<Html>
<h1>Заказ #{orderId}</h1>
<p>На сумму {total} ₽</p>
<Button href={`https://example.ru/orders/${orderId}`}>Открыть заказ</Button>
</Html>
);
}
import { render } from "@react-email/render";
const html = render(<OrderConfirmed orderId={1234} total={5990} />);
await sendEmail({ to, subject: "Заказ оформлен", html });
Тестируйте в десятке клиентов — Gmail, Mail.ru, Yandex Mail, Outlook, мобильные. Письма часто отображаются по-разному — особенно Outlook с его старым Word-движком.
Очередь и retry
Никогда не шлите email прямо из HTTP-обработчика — это блокирует ответ пользователю и ломает UX, если SMTP лежит. Кладите задачу в очередь:
// после оформления заказа
await emailQueue.add("order.confirmed", { orderId, userId });
return Response.json({ ok: true });
// worker
emailQueue.process("order.confirmed", async (job) => {
const { orderId, userId } = job.data;
const user = await db.user.findUnique({ where: { id: userId } });
await sendEmail({ to: user.email, /* ... */ });
});
BullMQ + Redis или RabbitMQ. Retry 3-5 раз с экспоненциальной задержкой при сбоях. Метрика — время от события до доставки (норма — секунды, не минуты).
Метрики
Отслеживайте на стороне сервиса (или в Sentry/Mixpanel):
- Delivered % — доставлено
- Bounced % — адрес не существует или почтовый ящик заблокирован
- Spam complaints — пользователь нажал «спам»
- Open rate — открыли (только если включён tracking pixel)
- Click rate — кликнули по ссылке
Bounce > 5% — у вас грязная база, чистите. Spam > 0.1% — вас скоро заблокирует провайдер.
152-ФЗ для рассылок
Транзакционная почта по событию пользователя — согласие подразумевается (он сам зарегистрировался / оформил заказ). Маркетинговая — отдельный явный чекбокс «согласен на рекламные рассылки», и обязательная ссылка «отписаться» в каждом письме.
Хранить базу адресов и логи отправки в РФ — требование 152-ФЗ для российских пользователей. Поэтому Unisender Go или Yandex 360 здесь предпочтительнее, чем SES в Frankfurt.
Итого
Для российского проекта в 2026 — Unisender Go или SendPulse как основной сервис, плюс Yandex 360 для маленьких объёмов. Зарубежные сервисы (Postmark, Resend) — отлично, но платежи сложны. Своими силами SMTP — не вариант никогда, кроме как для внутренних уведомлений в команду.
Частые вопросы
Сколько стоит транзакционная почта для среднего сайта?
Если шлёте 5000-20000 писем в месяц (типичный e-commerce средней руки) — Unisender Go от 500 до 1500 ₽/мес. Yandex 360 до 200 писем/день бесплатно — для лендинга или малого SaaS хватает. Postmark — $15-50 за тот же объём, но платежи проблематичны.
Можно ли в 2026 использовать SendGrid из России?
Технически API работает, но оплата с российской карты невозможна. Если есть зарубежный аккаунт и оплата — пожалуйста. Для нового российского проекта — нерабочий вариант, в любой момент аккаунт могут заблокировать без возврата денег.
Как улучшить доставляемость, если 30% писем уходят в спам?
Чек-лист: 1) SPF, DKIM, DMARC настроены и проходят (mail-tester.com → 9-10 баллов). 2) Отправитель — корпоративный адрес на вашем домене, не gmail или yandex. 3) Текст без подозрительных слов (всё каплосом, бесплатно, заработать). 4) В письме есть текстовая версия, не только HTML. 5) Ссылка «отписаться» в подвале. 6) IP репутация прогрета (для своего SMTP — постепенный рост объёма).
Что если пользователь сразу нажимает спам?
Один-два — не проблема. Но если их доля > 0.1% от рассылки, провайдер начнёт резать вашу доставку. У всех нормальных сервисов есть webhook на feedback loop — приходит уведомление «такой-то нажал спам», и вы автоматически удаляете адрес из базы. Не реагировать — путь к блокировке.
React Email или MJML для шаблонов?
React Email — если стек уже React, удобно работать с props и переиспользовать компоненты. MJML — стандарт индустрии, лучше документация, есть наследование шаблонов, проще передать дизайнеру. Оба генерят кросс-клиентский HTML, оба работают. Если команда — React-разработчики, берите react-email.
Хранить ли тело отправленного письма у себя?
Минимум — log с from/to/subject/timestamp/status для аудита и поддержки. Полное тело — обычно не нужно, его хранит сервис. Если письмо содержит юридически значимый контент (счёт, договор) — да, обязательно архивируйте у себя в S3/Object Storage с TTL по требованиям бухгалтерии.
Что делать с временными адресами почты (10minutemail.com и пр.)?
Блокировать на регистрации — есть готовые списки доменов. Для лидов с лендинга — обычно нет смысла, всё равно конверсия мала. Для SaaS-продукта с триалом — однозначно блокировать, иначе один пользователь регистрирует 50 триалов на разные одноразовые адреса.