Ушёл с DashaMail на Amazon SES за один вечер с Claude: 800 ₽ вместо 7 100 ₽ в месяц
У меня небольшой стартап. Он шлёт около ста тысяч электронных писем в месяц. Это письма без которых продукт не работает. Несколько лет они уходили через российский транзакционный SMTP, сраное дно, имя которому DashaMail. Каждый месяц: 5 000 ₽ за письма плюс 2 100 ₽ за выделенный IP-адрес. Итого 7 100 ₽ за то, что сервер принимает письмо и передаёт его дальше. Ничего больше он не делает.
В пятницу вечером я перевёл первый домен на Amazon SES. Тот же объём писем там стоит около 800 ₽ в месяц. Ниже расскажу, что такое SES, что именно нужно сделать, где можно споткнуться и почему большую часть кликов за меня сделал Claude.
Сколько это стоит на самом деле
Amazon SES берёт 0,10 $ за тысячу писем. Никакой абонентской платы, никаких тарифов «до 50 000 писем». Сто тысяч писем в месяц это 10 $, по курсу примерно 800 ₽. Выделенный IP у Amazon тоже есть, 24,95 $ в месяц, но для транзакционных писем с нормальной аутентификацией он не нужен, общий пул работает.
Разница почти в девять раз. За год это 75 тысяч рублей, которые просто лежали бы на счету.
Что такое Amazon SES и чем он отличается от «сервиса рассылок»
SES, Simple Email Service, это не конструктор рассылок. Там нет редактора писем, списков контактов и красивых отчётов об открытиях. Это почтовый узел: вы отдаёте ему готовое письмо по SMTP или через API, он подписывает его DKIM и доставляет. Всё, что умеет ваш код в части писем, продолжает работать, меняется только адрес сервера и логин с паролем.
Для транзакционных писем это ровно то, что нужно. Если у вас письма генерирует приложение, вам не за что платить сервису рассылок.
Что нужно сделать: шесть шагов
Весь путь занял у меня чуть больше часа, с 22:50 до полуночи, не считая ожидания ответа от Amazon. Я сидел с открытым Claude Code и расширением Claude in Chrome: Клод ходил по консоли AWS и панели регистратора, а я только входил в аккаунты и сохранял пароли. Вход и пароли Клод не трогает в принципе, это его правило, и оно правильное.
Шаг 1. Домен в SES
В консоли SES выбираем регион, у меня eu-central-1 (Франкфурт), и создаём identity типа «домен». Включаем Easy DKIM с ключом 2048 бит. Там же ставим галку «свой MAIL FROM домен» и вписываем поддомен вида bounce.ваш-домен.ru. Без этого письма уйдут с обратным адресом на amazonses.com, и DMARC не сойдётся.
Важно: регион в SES фиксируется навсегда. Домены, лимиты и SMTP-пароли привязаны к региону, в котором их создали. Выбрали Франкфурт, значит всё остальное тоже во Франкфурте.
Шаг 2. Шесть DNS-записей
Консоль выдаёт три CNAME для DKIM. К ним добавляем MX и TXT для поддомена bounce и запись DMARC, если её ещё нет.
ТипИмяЗначениеCNAME<токен1>._domainkey<токен1>.dkim.amazonses.comCNAME<токен2>._domainkey<токен2>.dkim.amazonses.comCNAME<токен3>._domainkey<токен3>.dkim.amazonses.comMXbounce10 feedback-smtp.eu-central-1.amazonses.comTXTbouncev=spf1 include:amazonses.com ~allTXT_dmarcv=DMARC1; p=none;
Корневой SPF домена трогать не нужно. SPF проверяется по домену конверта, то есть по bounce.ваш-домен.ru, а для него запись своя. Это ещё и спасает от лимита в десять DNS-запросов, в который легко упереться, если в корневом SPF уже сидят почтовый хостинг и пара старых провайдеров.
У меня домен на reg.ru. Клод добавил все шесть записей сам, я только вошёл в панель. Через пятнадцать минут статус домена в SES сменился на Verified.
Шаг 3. Выход из песочницы
Новый аккаунт SES живёт в песочнице: 200 писем в сутки, одно письмо в секунду и только на заранее подтверждённые адреса. Для тестов этого хватает, для работы нет.
Кнопка «Request production access» становится активной после подтверждения домена. Форма простая: тип писем (транзакционные), адрес сайта, контактная почта, согласие с правилами. Через минуту прилетает автоматический ответ от поддержки с просьбой рассказать подробнее: что за письма, сколько в месяц, откуда берутся адреса получателей, что происходит при отказах и жалобах, образец письма. Отвечаете одним сообщением в кейсе, по-английски. Решение обычно в течение суток.
Что я написал: только транзакционные письма, около тысячи в месяц для первого домена, адреса только от зарегистрированных пользователей, отказы обрабатывает встроенный список подавления плюс уведомления через SNS, образец письма с подтверждением регистрации.
Шаг 4. SMTP-реквизиты
В SES → SMTP settings → Create IAM credentials. Amazon создаёт отдельного IAM-пользователя с правом только отправлять почту и показывает логин и пароль. Один раз. Закрыли страницу, пароль пропал, остаётся только создать нового пользователя.
Сервер: email-smtp.eu-central-1.amazonaws.com, порт 587 с STARTTLS или 465 с TLS. Логин это «SMTP user name» вида AKIA…, а не имя пользователя IAM, на этом тоже спотыкаются.
Шаг 5. Грабли, на которые я наступил
Первые десять минут после создания реквизитов SES отвечает 535 Authentication Credentials Invalid. Это не ошибка в пароле, это задержка распространения IAM. Я перепроверил регион, права пользователя, формат пароля, потом просто подождал, и в 23:58 те же реквизиты прошли. Если бы знал заранее, сэкономил бы полчаса нервов.
Второе: файл с паролем я сгоряча вставил в чат. Пароль остался в истории. Пользователя придётся пересоздать. Не делайте так.
Шаг 6. Переключение
Самая приятная часть. В моём приложении письма шлёт nodemailer, настройки берутся из переменных окружения: сервер, порт, логин, пароль. Код не менялся вообще. Четыре значения в конфиге, перезапуск, готово. Старые реквизиты оставил на случай отката: вернуть четыре строки это пять минут.
Проверка после переключения: отправить письмо себе на mail.ru, Яндекс и Gmail, открыть исходник и убедиться, что стоят DKIM=pass, SPF=pass с smtp.mailfrom=bounce.ваш-домен.ru и DMARC=pass. Для спокойствия прогнать через mail-tester.com.
Чего бояться
Отказы. У российского провайдера жёсткие отказы были невидимы. SES их считает: при доле отказов выше 5 % аккаунт берут на обзор, выше 10 % останавливают отправку. По жалобам пороги ещё жёстче, 0,1 % и 0,5 %. Если у вас гости вводят адреса руками и ошибаются, включённый по умолчанию список подавления спасёт на старте, но нормальную обработку отказов через SNS лучше сделать сразу.
Mail.ru и Яндекс. Почти половина моих получателей там. Как они относятся к общим IP Amazon, узнаю на объёме. План простой: зарегистрировать домен в постмастерах обоих, смотреть долю спама, и если что, включить выделенный IP за 24,95 $. Даже с ним выходит дешевле, чем раньше.
Один аккаунт, много доменов. Production access выдаётся на аккаунт и регион один раз. Следующие домены подключаются по тому же шаблону за полчаса: identity, шесть записей, свой SMTP-пользователь на каждый сервис, чтобы отзывать независимо.
Что в итоге
Вечер пятницы, час чистого времени, десяток сообщений Клоду и одна заявка в поддержку Amazon. Вместо 7 100 ₽ в месяц около 800 ₽. Следующие на очереди два других моих домена, и там уже не будет ни ожидания, ни граблей: шаблон записан.
Если у вас письма генерирует приложение, а платите вы как за сервис рассылок, посчитайте. Скорее всего, вы тоже переплачиваете в разы.