Если email-рассылка останавливается посередине, проблема обычно не в одном адресе, а в управлении очередью. Worker может завершиться на исключении, упереться в квоту провайдера или оставить кампанию в состоянии running без возможности продолжить.
Определите последнее успешно отправленное письмо и первую необработанную запись. Сравните журнал приложения, очередь SMTP и лимиты провайдера за этот момент.
Что сделать в первую очередь
- Остановите повторный запуск кампании, чтобы не отправить первые письма заново.
- Сохраните текущие статусы получателей и позицию очереди.
- Проверьте квоту, rate limit и доступность SMTP.
- Найдите первую постоянную или временную ошибку после остановки.
Почему возникает проблема
Симптом обычно появляется не из-за одной настройки. Сначала разделите путь данных на этапы и найдите место, где фактическое поведение расходится с ожидаемым.
- Исключение одного адреса завершает весь batch.
- Провайдер временно ограничил скорость или дневной объем.
- Worker убит по памяти, таймауту или во время деплоя.
- Статус кампании обновляется отдельно от транзакции очереди.
Пошаговая диагностика
- Сверьте sent, failed, pending и accepted по журналам приложения и SMTP.
- Проверьте время жизни worker и потребление памяти на больших шаблонах.
- Разделите ответы 4xx для retry и 5xx для постоянного отказа.
- Проверьте блокировку кампании и heartbeat фонового процесса.
- Запустите малую тестовую партию на разрешенных адресах.
Как исправить
Исправляйте подтвержденную первопричину и сохраняйте возможность отката. После каждого изменения повторяйте один и тот же контрольный сценарий, чтобы не спутать результат нескольких правок.
- Обрабатывайте каждого получателя независимо и сохраняйте результат атомарно.
- Добавьте ограниченный retry с backoff только для временных ошибок.
- Учитывайте rate limit и отправляйте контролируемыми партиями.
- Возобновляйте кампанию только с pending, не меняя уже sent.
- Добавьте watchdog для зависшего состояния running без heartbeat.
Как проверить результат
- Тестовая кампания завершается при наличии одного неверного адреса.
- Перезапуск продолжает очередь без повторной отправки успешным получателям.
- Статусы приложения соответствуют accepted, bounce и delivered провайдера.
Как не допустить повторения
- Мониторьте скорость, размер pending и возраст старейшего письма.
- Проверяйте лимиты провайдера до старта крупной кампании.
- Разделяйте маркетинговые и транзакционные очереди.
Частые вопросы
Можно ли просто перезапустить рассылку?
Только если очередь хранит статусы каждого получателя. Иначе есть риск дублей.
Почему accepted не означает delivered?
SMTP принял письмо в обработку, но окончательная доставка или bounce могут прийти позже.
Когда стоит обратиться за помощью
Для диагностики нужны обезличенные статусы очереди, коды SMTP и настройки worker. Список адресов получателей и содержимое писем обычно не требуются.
Итог
Надежная рассылка продолжает работу после локальной ошибки и не отправляет письмо повторно. Я могу исправить очередь, retry, статусы доставки и мониторинг кампаний.