Рассылки, папки по +метке, TRAP только для чужих адресов, служебное API для Jambotron #26

Merged
Liosha84 merged 1 commits from feat/lists-tags-service-api into master 2026-11-07 14:45:14 +01:00
Owner

Первый из двух PR почты по согласованной схеме (рабочая почта сотрудников).

Что делает

  • Рассылки (V6): письмо на alerts-prod@ → каждому участнику своя копия (своё «прочитано») в папку рассылки. Закрытая рассылка (по умолчанию) — только от вошедших отправителей (Kuma через monitor@, Jambotron); снаружи 550 5.7.1.
  • +метка → папка: bob+prod@ → ящик bob@, папка prod (создаётся сама). Системные папки так не задать. В именах ящиков/рассылок + теперь нельзя.
  • TRAP теперь держит только чужие адреса (одна копия в INBOX отправителя); наши ящики и рассылки доставляются — алерты staging дойдут.
  • Служебное API /api/service/** для Jambotron, токен SERVICE_TOKEN (генерирует secrets-init в томе секретов; без него API выключено): аккаунты (создать — пароль один раз; выключить — вон из всех рассылок; новый пароль), рассылки (точный состав, удалить).
  • Настройки → LISTS для администраторов: создать/изменить/удалить рассылку, участники галочками.
  • README: ловушка, метки, рассылки, API.

Проверено

  • 86 тестов (новые: router — метки/рассылки/ловушка, admin lists, service API, имена папок).
  • Живой прогон jar на Postgres 17: миграции V1–V6; API (401 без токена, 201+пароль, 409 адрес занят рассылкой, 400 неизвестный участник, выключение → вон из рассылки, удаление 204/404); SMTP: аноним → закрытая рассылка 550; staging (TRAP) → alerts-prod@ + jambotronpw+billing@ + 2 внешних: оба участника получили копию в prod, папка billing создана, внешние — одна копия в INBOX staging@, очередь наружу пуста.
  • ng build OK.

После мержа: образ → redeploy почты на prod (secrets-init допишет SERVICE_TOKEN). Дальше: Kuma → alerts-prod@/alerts-staging@; второй PR почты (несколько ящиков у логина, общие ящики); PR Jambotron.

α

🤖 Generated with Claude Code

Первый из двух PR почты по согласованной схеме (рабочая почта сотрудников). **Что делает** - **Рассылки** (V6): письмо на `alerts-prod@` → **каждому участнику своя копия** (своё «прочитано») в папку рассылки. Закрытая рассылка (по умолчанию) — только от вошедших отправителей (Kuma через `monitor@`, Jambotron); снаружи `550 5.7.1`. - **`+метка` → папка**: `bob+prod@` → ящик `bob@`, папка **prod** (создаётся сама). Системные папки так не задать. В именах ящиков/рассылок `+` теперь нельзя. - **TRAP** теперь держит только **чужие** адреса (одна копия в INBOX отправителя); наши ящики и рассылки доставляются — алерты staging дойдут. - **Служебное API** `/api/service/**` для Jambotron, токен `SERVICE_TOKEN` (генерирует `secrets-init` в томе секретов; без него API выключено): аккаунты (создать — пароль один раз; выключить — вон из всех рассылок; новый пароль), рассылки (точный состав, удалить). - **Настройки → LISTS** для администраторов: создать/изменить/удалить рассылку, участники галочками. - README: ловушка, метки, рассылки, API. **Проверено** - 86 тестов (новые: router — метки/рассылки/ловушка, admin lists, service API, имена папок). - Живой прогон jar на Postgres 17: миграции V1–V6; API (401 без токена, 201+пароль, 409 адрес занят рассылкой, 400 неизвестный участник, выключение → вон из рассылки, удаление 204/404); SMTP: аноним → закрытая рассылка 550; staging (TRAP) → `alerts-prod@` + `jambotronpw+billing@` + 2 внешних: оба участника получили копию в **prod**, папка **billing** создана, внешние — одна копия в INBOX staging@, очередь наружу пуста. - `ng build` OK. **После мержа**: образ → redeploy почты на prod (secrets-init допишет `SERVICE_TOKEN`). Дальше: Kuma → `alerts-prod@`/`alerts-staging@`; второй PR почты (несколько ящиков у логина, общие ящики); PR Jambotron. α 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Liosha84 added 1 commit 2026-11-07 14:15:37 +01:00
- V6 mail_lists + mail_list_members: письмо на alerts-prod@ → каждому участнику своя копия в папку рассылки;
  закрытая рассылка — только от вошедших отправителей (550 снаружи)
- bob+prod@ → ящик bob@, папка prod (создаётся сама; системные папки нельзя)
- TRAP: чужие адреса → одна копия в INBOX отправителя; наши ящики и рассылки доставляются
- /api/service/** (SERVICE_TOKEN из secrets-init): аккаунты (пароль один раз, выключение → вон из рассылок), рассылки
- MailDirectory: одно пространство адресов для ящиков и рассылок, без «+» в именах
- Настройки → LISTS для администраторов
- 86 тестов; живой прогон на Postgres 17: миграции V1–V6, API, SMTP (рассылка/метка/ловушка)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Liosha84 merged commit 80d2988fa3 into master 2026-11-07 14:45:14 +01:00
Sign in to join this conversation.