WEB-345 · Дефект · — · web
P1: Письмо верификации при регистрации НЕ отправляется (молча) — UI врёт «We sent a verification link», в журнале ноль mail/smtp событий
Закрыт
P1 · важно
ведёт: coordinator-fable
Суть
# Репро (owner 24.08 00:37-00:46, живой тест инвайтов, прод v4-def2df3f7)
1. /admin/invite-codes → создать инвайт → регистрация 1@wool2.online и 2@wool2.online по инвайту.
2. UI: «Check your email / We sent a verification link» — владелец письма НЕ получил.
3. journalctl note-clone-3010 за окно 00:35–00:52: НОЛЬ строк mail/smtp/verification-send. Отправка либо не сконфигурирована, либо падает в тихий catch (нарушение правила 10 — тихая ошибка запрещена).
## Что проверить
- Мейлер регистрации: какой транспорт (smtp? resend?), есть ли env-креды в проде, логируется ли отправка/ошибка.
- Добавить лог+маячок на КАЖДУЮ попытку отправки и на fail (rule 10).
## Обход (сделано координатором 24.08 01:05)
QA-аккаунты owner 1@/2@wool2.online верифицированы напрямую (emailVerified=now()) — owner разблокирован для теста.
Родня: WEB-346 (UX логина при неверифицированной почте), WEB-071 (инвайт-гейт, включён 23.08). Контекст: тикет WEB-320 (леджер), скрины owner в чате 24.08 00:46.
Доказательства
[24.08 01:05] Диагноз по журналу: [Auth] Blocking credentials login { reason: 'email_not_verified' } для 1@ и 2@wool2.online — гейт логина работает, но письмо не уходит. Обход: emailVerified=now() для обоих QA-аккаунтов (UPDATE 2 подтверждён).
[24.08 02:10, ПОСАДКА 41 v4-452800ff4] КОРЕНЬ ПЕРЕСМОТРЕН доказательным пробником. Транспорт РАБОТАЕТ: регистрация qa-mailprobe-l43@wool2.online → {"event":"email.send.success","durationMs":311,"transport":"smtp"} → postfix 5AAAA740996 → catch-all *@wool2.online → /usr/local/bin/mail-to-noteclone.py → webhook OK 200 subject='Verify your Antigravity email'. То есть письма СЛАЛИСЬ и раньше — но (а) старый код не логировал ни попытку, ни исход (исправлено в l42mail d7397b3: structured-события startup/success/failure/skipped + счётчики), и (б) домен wool2.online — «внутренний»: ВСЯ его почта съедается продуктовым инжестом (почта→заметка), человек её не видит. Поэтому owner «не ловил письма» на 1@/2@wool2.online — они ушли в /api/email/webhook. ОСТАТОК ТИКЕТА: (1) деливерабилити наружу (gmail и т.п.) с домашнего IP не проверена — отдельная проверка; (2) UX: для адресов своего же домена предупреждать или автоверифицировать. Острота снята грейс-периодом WEB-346 (в проде с посадки 41: EMAIL_VERIFY_GRACE_DAYS=3 — неверифицированных пускаем).
[2026-08-26 00:20Z] Автор web345 @83053345: письмо верификации — sender/registration route/UI исправлены, failure теперь честно sent:false (не молчит, не врёт UI), журнал+маячок. Mock-тесты 62/62. Маркер в worktree. -> review на независимую приёмку (acc345 запущена). НИКАКОГО build/prod, письма моки.
[2026-08-26 00:24Z] ПРИНЯТ acc345 (независимо, приёмщик≠автор): GO. Негативы: провайдер-фейл→честная ошибка+журнал (не молчит, не sent:true), успех→sent:true, троттлинг. → done.
[28.08 14:45Z Фабл] Вопрос владельца (голос 12:55): «на малинке шлём без провайдера — почему на Oracle иначе?» Факты сняты координатором: Pi postfix relayhost ПУСТ (прямая отправка), transport-карта: gmail.com/googlemail.com → [smtp.eircom.net]:25 (домашний ISP). С A1 проба: исходящий 25 ЗАКРЫТ (политика OCI) и 443 к MX закрыт нашим egress-забором — прямая отправка с Oracle невозможна, eircom-релей с чужой сети откажет. Владельцу предложены варианты: А) переходно слать через малинку (без провайдера, зависимость от Pi), Б) для прода лёгкий релей (Resend/SES) как транспорт 587 + SPF/DKIM на sixbyy.com. Рекомендация: сейчас А, к переезду Б. Ждём выбора владельца.
Починено в
a453b16
Лента
2026-08-25T07:12:18.186Z · fable-opsСТАТУС: ядро тикета опровергнуто (посадка 41). Письмо ОТПРАВЛЯЕТСЯ: регистрация qa-mailprobe-l43@wool2.online -> email.send.success (smtp, 311ms) -> postfix -> webhook 200. Owner не видел писем т.к. домен wool2.online внутренний — вся его почта съедается продуктовым инжестом (почта->заметка). Острота снята WEB-346 grace 3 дня. ОСТАЁТСЯ ОТКРЫТЫМ узко: (1) внешняя деливерабилити (gmail и т.п.) с домашнего IP не проверена; (2) UX для адресов своего домена (предупреждать/автоверифицировать). Оставляю в review под этот остаток.
Воркер
не привязан — привязать:
curl -X POST https://bugs.wool2.online/api/web/assign -H 'content-type: application/json' \
-d '{"issueId":"WEB-345","session":"<имя tmux-сессии>","host":"m4"}'
Обновлён
2026-08-28T12:56:42.482Z