О платформе Войти
← К списку версий
v0.98.0 19.10.2026 MINOR Текущая
Предупреждения о запланированной рассылке в Telegram
ТЗ 289 «Контроль рассылки». 19 октября 2026 года с продакшена my.ipd.by ушла массовая рассылка, о которой администратор узнал постфактум: письма формируются по расписанию и уходят сами (буфер PreparedEmail и кампании Campaign), а отдельного предупреждения о запуске не было. Теперь платформа заранее сообщает администратору в Telegram: за 24 часа, 4 часа, 1 час и 15 минут до отправки ближайших писем приходит одно сводное сообщение со числом писем и списком получателей и тем. Каждое пороговое окно отправляется один раз (дедупликация в таблице mailing_alerts), повторные запуски не дублируют предупреждения. Версия v0.98.0.
Что сделано
  • Предупреждение до отправки - Администратору в Telegram (admin-бот) приходит сообщение за 24 часа, 4 часа, 1 час и 15 минут до отправки ближайших писем: сколько писем уйдёт, когда и кому — получатели и темы. Окно выбирается по остатку времени до самого раннего письма, поэтому «за час» не придёт раньше, чем письмо окажется в часе от отправки.
  • Триггеры — буфер и кампании - Мониторятся оба источника плановой рассылки: готовые письма в буфере (PreparedEmail со статусом queued и scheduled_at) и запланированные кампании (Campaign со статусом scheduled).
  • Одно сообщение на окно, без повторов - Один запуск команды собирает все письма, попадающие в пороговое окно, и отправляет одно сводное сообщение; факт отправки фиксируется в mailing_alerts (тип + id + порог), поэтому повторные запуски каждые 5 минут не дублируют предупреждения.
  • Только оповещение - Фича ничего не отменяет и не задерживает: рассылка идёт как шла, предупреждение лишь информирует. Управляется флагом MAILING_ALERTS_ENABLED; команда mail:preflight-alerts поддерживает --dry-run — показать, что было бы отправлено, не отправляя.
Проверено
  • Тесты - tests/Feature/MailingPreflightAlertsTest.php — 7 тестов: порог выбирается по остатку времени, письма вне окна не попадают, одно сообщение на окно, повторный запуск не дублирует, отключённый флаг молчит, --dry-run ничего не отправляет и не помечает, сообщение содержит получателя и тему. Полный прогон платформы: 478 тестов, 477 пройдено, 1 условно пропущен (2501 утверждение).
  • Схема versions - Восстановлены пропущенные колонки таблицы versions (released_at, notes): при релизе 0.97.1 их завели только в сидер, из-за чего сид падал на чистой базе и часть тестов не запускалась. Теперь сид и весь набор тестов зелёные.
  • Регрессия ссылок - Название расписания на странице расписаний оформлено как ссылка по правилу ТЗ 280 (color: var(--link) + text-decoration: underline) — TextLinkVisibilityTest проходит.
  • Версия платформы - Поднята до v0.98.0: config/app.php, APP_VERSION в .env и .env.example; VersionSeeder — v0.98.0 актуальная. VersionFeatureTest и SeederKeepsWorkingDataCleanTest проходят.
Результат
  • Администратор получает в Telegram предупреждение за сутки, 4 часа, час и 15 минут до ухода запланированной рассылки — со списком писем и получателей: нежелательную массовую отправку видно заранее, а не постфактум.