Разделение IP-пулов для транзакционных и маркетинговых писем: почему смешивать нельзя
Один агрессивный промо-запуск на 200k адресов утаскивает ваши OTP и письма для сброса пароля в «Спам» на сутки. Разбираем механику: репутация считается по потоку, а не по домену, и показываем полную схему изоляции — поддомены, IP-пулы, раздельные DKIM-селекторы, Return-Path под FBL, конфиг Postfix и график прогрева.
EvilMail Team14 июля 2026 г.13 мин чтения
Маркетолог нажал «Отправить» — и OTP перестали доходить
14:00, маркетинг запускает промо-кампанию на 200 000 адресов. К 14:40 в саппорт летят тикеты: «не приходит код подтверждения», «сброс пароля висит в спаме». В коде транзакционного сервиса ничего не менялось. Изменился сосед по IP.
Это не гипотетика, а типовой инцидент, который я разруливал не один раз. Корень у него всегда один: транзакционка и маркетинг уходят с одного отправляющего идентификатора. Владельцы сервиса списывают это на «капризные спам-фильтры Gmail», но фильтры отработали ровно так, как спроектированы.
Ключевой факт, который меняет всё: приёмник ведёт репутацию не по вашему домену, а по кортежу `sending IP + DKIM d= + Return-Path (MAIL FROM)`. Gmail Postmaster и Microsoft SNDS считают статистику именно по этому потоку. Когда с него за 40 минут прилетает 200k писем, у части которых complaint rate 0.2–0.3%, а часть отскакивает от мёртвых адресов, репутация IP проседает целиком. И письмо «Ваш код: 481920», у которого complaint rate около нуля и open rate 85%, наследует эту просадку — потому что физически идёт по тому же кортежу.
Транзакционка и маркетинг — статистически разные распределения. Смешивая их, вы усредняете метрики в худшую сторону: хороший поток тянет плохой вверх ровно до момента, пока плохой не утянет хороший вниз. Изоляция потоков — это не best-practice ради галочки в аудите, это изоляция отказов. За письмом с OTP стоит живой человек, который ждёт код здесь и сейчас; он не может «подождать, пока прогреется репутация».
Два потока — два профиля риска
Прежде чем резать инфраструктуру, стоит понять, чем именно потоки отличаются в глазах приёмника — потому что мониторит он именно эти параметры.
Паттерн объёма. Транзакционка — ровный поток, коррелирующий с активностью пользователей. Маркетинг — пиковые батчи по 50–200k за раз. Резкий скачок отправки с IP сам по себе триггерит throttling у Microsoft (temp-fail 4.7.x).
Engagement. Транзакционные письма открывают в 70–90% случаев — человек только что запросил действие. Промо — 15–25% в лучшем случае. Для Gmail engagement — один из главных сигналов.
Bounce rate. Транзакционка почти всегда идёт на валидный, только что введённый адрес. Маркетинг бьёт по базе, которой местами два года, — hard bounce и попадания в spam-trap неизбежны.
Complaint rate. У транзакционки жалоб практически нет. У маркетинга 0.1–0.3% — норма жизни. Проблема в том, что жалоба привязывается к IP, а не к типу письма.
Контент. Промо — тяжёлый HTML, картинки, трекинг-пиксели, десятки ссылок. Транзакционка — короткий текст и одна кнопка.
Вывод отсюда простой: у потоков должны быть разные пороги алертинга и разные требования к прогреву. Держать их на одном пуле — значит применять одну планку к двум несовместимым профилям.
Метрика (Gmail Postmaster)
Транзакционка
Маркетинг
Красная линия
Spam complaint rate
~0%
0.1–0.3%
0.1% — тревога, 0.3% — режет доставляемость
Open rate
70–90%
15–25%
падение engagement тянет репутацию вниз
Domain/IP reputation
High
High/Medium
Low/Bad = массовый Spam-folder
Архитектура разделения: слои идентичности
Разделение — это не «купите второй IP». Это аккуратная нарезка идентичностей отправителя так, чтобы репутации физически не пересекались, но при этом весь трафик оставался в рамках одного организационного домена ради DMARC alignment.
Пять слоёв, которые надо развести:
1.Поддомены.mail.example.com — транзакционка, news.example.com или e.example.com — маркетинг. Корневой @example.com не используем для bulk вообще: там живёт корпоративная переписка, и её репутацию нельзя ставить в зависимость от рассылочных запусков.
2.Отдельные IP или IP-пулы. Каждый поддомен биндится на свой исходящий адрес.
3.Раздельные DKIM-селекторы.txn._domainkey.mail.example.com и mktg._domainkey.news.example.com, разные ключи по 2048 бит.
4.Разные Return-Path / MAIL FROM. Нужно и для раздельных FBL-петель, и для корректного DMARC alignment.
5.PTR и HELO/EHLO под каждый поток. Обратная запись должна совпадать с HELO-именем.
При этом DMARC-политику держим на корне с p=reject. Работает это благодаря relaxed alignment: SPF и DKIM сверяются на уровне организационного домена (example.com), а поддомены mail. и news. наследуют его по организационному признаку. То есть строгая политика на корне и разные поддомены-отправители сосуществуют без конфликта.
DNS: что реально прописать
Самая частая ошибка при разделении — считать, что настройки корня наследуются на поддомены. SPF не наследуется. Если у news.example.com нет своей TXT-записи SPF, проверка вернёт none, и половина усилий насмарку.
PTR-записи ставятся в обратной зоне у хостера или RIR и должны замыкать forward-confirmed rDNS (FCrDNS): PTR(IP) → hostname → A(hostname) → тот же IP. Если цепочка не замыкается, Gmail и особенно Microsoft снижают доверие сразу.
Проверяем всё до включения трафика:
bash
# SPF на каждом поддомене (не должен быть пустым)
dig +short txt news.example.com
dig +short txt mail.example.com
# DKIM-селекторы резолвятся
dig +short txt mktg._domainkey.news.example.com
# PTR совпадает с HELO-именем
dig +short -x 203.0.113.20 # → news.example.com.
dig +short news.example.com # → 203.0.113.20 (замыкание FCrDNS)
# HELO, который реально анонсирует MTA
openssl s_client -starttls smtp -connect 203.0.113.20:25 -quiet 2>/dev/null | head
MTA-STS (_mta-sts.example.com + policy в /.well-known/mta-sts.txt) и TLS-RPT общие для домена — их не размножаем по поддоменам, достаточно корневых.
Реализация на Postfix
На Postfix разделение делается через sender_dependent_default_transport_maps: по домену отправителя выбираем транспорт, а каждый транспорт биндится на свой IP, HELO и DKIM-конфиг.
Раздельные syslog_name — не косметика: они дают чистую раскладку логов по потокам, без неё вы не отделите deferral транзакционки от маркетинга при разборе инцидента.
DKIM-селекторы раздаёт OpenDKIM через SigningTable/KeyTable по домену From:
Если вы на коммерческом ESP — логика та же, меняется только рычаг. В Amazon SES это dedicated IP pools + configuration sets, привязанные к разным sending identities. В Postmark — раздельные Message Streams (transactional и broadcast) физически на разных пулах. В SparkPost — ip_pools + отдельные sending domains. Не смешивайте stream'ы: это ровно та стена, которую мы строим руками на Postfix. Транзакционные потоки инфраструктуры EvilMail (OTP, сбросы паролей) держатся на изолированном пуле именно поэтому — код должен долетать при 99.9x%, и его репутацию нельзя отдавать в заложники рассылочному календарю.
Прогрев раздельно и правильно
Новый IP или поддомен нельзя заливать целевым объёмом с первого дня — приёмник расценит скачок как компрометацию или снапшот спам-бота. Прогрев (warmup) начинается с ~50 писем в день и удваивается раз в 1–2 дня до плана.
Важный нюанс: потоки греются с разной скоростью. Транзакционка выходит на плато быстро — она идёт на реальный трафик с open rate 80%+, и приёмник видит здоровый engagement почти сразу. Маркетинг прогревают сегментами: сначала самые активные подписчики (открывали за последние 30 дней), и только потом холодная часть базы. Залить весь список сразу с непрогретого IP — гарантированный 4.7.x от Microsoft и падение domain reputation в Gmail до Medium.
В процессе мониторим: Gmail Postmaster (domain и IP reputation по каждому поддомену отдельно), deferral rate и temp-fail 4xx от Microsoft. Рост deferral во время прогрева — норма, но если он не спадает после дня отдыха на текущем объёме — притормаживаем удвоение.
Мониторинг и раздельные алерты
Каждый поддомен верифицируется в Google Postmaster Tools отдельно — это разные сущности, и репутацию раздельно вы увидите только так. На стороне Microsoft регистрируем IP в SNDS (данные о жалобах и трапах) и подключаем JMRP — FBL-петлю Microsoft. Yahoo/AOL FBL завязан на Return-Path, и именно поэтому маркетинговый [email protected] должен отличаться от транзакционного: жалобы возвращаются в правильную петлю и чистят правильный список, не задевая соседний поток.
DMARC-агрегаты (rua) парсим с раскладкой по потокам — по source IP видно, какой пул даёт failed alignment.
SLA у потоков разные, и алерты должны это отражать:
Транзакционка: алерт при deferral > 1% или падении reputation до Medium. Это инцидент — за ним пользователи, ждущие код.
Маркетинг: алерт при complaint rate > 0.2%. Это повод притормозить кампанию и почистить сегмент, но не будить дежурного ночью.
Чеклист внедрения
Заведены поддомены: mail. (txn) и news./e. (mktg); корень для bulk не используется.
PTR каждого IP совпадает с HELO-именем, FCrDNS замыкается (-x резолвит в тот же A).
SPF прописан на каждом поддомене отдельно (не наследуется от корня).
Раздельные DKIM-селекторы (txn., mktg.), ключи 2048-bit, оба резолвятся и проходят проверку.
DMARC на корне p=reject, alignment по обоим потокам зелёный (relaxed org-домен).
Return-Path / MAIL FROM разведён по поддоменам ради FBL и alignment.
Транспорты Postfix (txn-out/mktg-out) биндятся на нужные IP, HELO и syslog_name.
OpenDKIM SigningTable/KeyTable раздаёт селектор по домену From.
Warmup-график запущен: старт ~50/день, удвоение раз в 1–2 дня, маркетинг — сегментами.
Postmaster Tools верифицирован по каждому поддомену; SNDS + JMRP зарегистрированы на IP.
FBL-петли (JMRP, Yahoo) подключены и разложены по Return-Path.
Пороги алертов заданы раздельно; в runbook описан сценарий «маркетинг убил транзакционку» и порядок отката.
Разделение пулов не делает вашу доставляемость идеальной — оно делает её предсказуемой. Плохой промо-запуск остаётся плохим промо-запуском, но теперь он бьёт только по маркетинговому пулу, а код для входа долетает за секунды. Это и есть цель: чтобы падение одного потока никогда не становилось падением другого.