fix(smtp): GTS_SMTP_FROM_ADDRESS -> GTS_SMTP_FROM (empty From header fixed); openspec: smtp-email spec

This commit is contained in:
estorozhenko
2026-09-13 07:19:17 +00:00
parent d768c8f2d3
commit 1cee142631
3 changed files with 125 additions and 2 deletions
@@ -0,0 +1,74 @@
# gotosocial/smtp-email Specification
## Purpose
Обеспечить доставляемость исходящих писем GoToSocial (подтверждение email,
системные уведомления) через SMTP Jino, гарантируя корректный, непустой
заголовок `From` и валидную аутентификацию. Исправление применено 2026-09-13
(пустой From из-за неверной env-переменной `GTS_SMTP_FROM_ADDRESS`).
## Requirements
### Requirement: SMTP-конфигурация через корректные env-ключи GtS
- **MUST**: Исходящая почта настраивается через env-переменные, которые
GtS 0.22.x реально читает (префикс `GTS_`, ключи конфига `smtp-*`):
`GTS_SMTP_HOST`, `GTS_SMTP_PORT`, `GTS_SMTP_USERNAME`,
`GTS_SMTP_PASSWORD`, `GTS_SMTP_FROM`.
- **MUST NOT**: НЕ используется `GTS_SMTP_FROM_ADDRESS` — такого ключа GtS
не знает, он молча игнорируется, и заголовок `From` в письмах становится
пустым.
- **MUST**: `GTS_SMTP_FROM` и `GTS_SMTP_USERNAME` совпадают
(`social@dedinit.ru`) — envelope-отправитель и заголовок From согласованы.
#### Scenario: From заполнен после фикса
- **GIVEN** docker-compose.yml содержит `GTS_SMTP_FROM: "social@dedinit.ru"`
и контейнер пересоздан
- **WHEN** выполнить
`docker inspect -f '{{.Config.Env}}' gotosocial | tr ' ' '\n' | grep GTS_SMTP_FROM`
- **THEN** вывод содержит `GTS_SMTP_FROM=social@dedinit.ru`
#### Scenario: Неверный ключ отсутствует
- **GIVEN** конфигурация в docker-compose.yml
- **WHEN** выполнить `grep -c GTS_SMTP_FROM_ADDRESS docker-compose.yml`
- **THEN** результат равен `0` (несуществующий ключ больше не используется)
### Requirement: Регистрационные письма приходят с заполненным From
- **MUST**: Письмо подтверждения email (шаблон `email_confirm`) отправляется
с непустым заголовком `From`, равным `social@dedinit.ru` (значение
`GTS_SMTP_FROM` → `GetSMTPFrom()` не пуст).
- **SHOULD**: Периодически проверять доставляемость вручную (тестовое письмо
через SMTP Jino).
#### Scenario: Письмо подтверждения после регистрации
- **GIVEN** настроен SMTP (host/port/username/password/from)
- **WHEN** пользователь регистрируется на инстансе
(`https://social.dedinit.ru/signup`)
- **THEN** в письме подтверждения поле `From` непустое и равно
`social@dedinit.ru`, а `confirmation_sent_at`/`last_emailed_at` у
пользователя в БД проставлены
#### Scenario: SMTP-доступность Jino
- **GIVEN** SMTP smtp.jino.ru:587
- **WHEN** проверить ESMTP-баннер и аутентификацию `social@dedinit.ru`
- **THEN** баннер `220 smtp-out*.jino.ru ESMTP Postfix`, логин проходит,
RCPT TO принимается, DATA → `250 Ok: queued`
### Requirement: Осведомлённость о репутации домена (SPF/DMARC)
- **SHOULD**: Для полной доставляемости на внешние ящики (Яндекс и др.) у
домена dedinit.ru настроены SPF (`include:jino.ru`) и DMARC; без них
письма могут попадать в спам даже при корректном From.
- **SHOULD**: Задача настройки SPF/DMARC отслеживается отдельным трекером
и не блокирует данный фикс.
#### Scenario: Проверка наличия SPF
- **GIVEN** домен dedinit.ru
- **WHEN** выполнить `dig +short TXT dedinit.ru`
- **THEN** среди записей есть строка, начинающаяся с `v=spf1` (включает
jino.ru), либо задача открыта в STATUS.md