feat(email): контактный адрес инстанса, Reply-To в письмах и тестовая отправка
Новая настройка instance_settings.contact_email (включён/адрес, с валидацией формата) — подставляется в заголовок Reply-To писем подтверждения регистрации, приглашений и саммари. Админ-эндпоинт POST /admin/settings/test-email отправляет проверочное письмо синхронно и возвращает внятный результат (успех либо текст ошибки транспорта), не раскрывая логин/пароль SMTP.
This commit is contained in:
@@ -134,7 +134,8 @@ class AuthService:
|
||||
password_hash=hash_password(password),
|
||||
team_id=team_id,
|
||||
)
|
||||
await self._issue_verification_email(user)
|
||||
reply_to = cfg.contact_email if cfg.contact_email_enabled else None
|
||||
await self._issue_verification_email(user, reply_to=reply_to)
|
||||
await self._session.commit()
|
||||
return user
|
||||
|
||||
@@ -216,7 +217,7 @@ class AuthService:
|
||||
await self._redis.set(f"{REFRESH_KEY_PREFIX}{jti}", str(user_id), ex=ttl_seconds)
|
||||
return TokenPair(access_token=access_token, refresh_token=refresh_token)
|
||||
|
||||
async def _issue_verification_email(self, user: User) -> None:
|
||||
async def _issue_verification_email(self, user: User, *, reply_to: str | None = None) -> None:
|
||||
token = secrets.token_urlsafe(32) # 256 бит случайности
|
||||
expires_at = datetime.now(UTC) + timedelta(
|
||||
hours=self._settings.email_verification_ttl_hours
|
||||
@@ -231,6 +232,7 @@ class AuthService:
|
||||
to=user.email,
|
||||
subject="Подтверждение регистрации VidConf",
|
||||
body=f"Для подтверждения email перейдите по ссылке: {link}",
|
||||
reply_to=reply_to,
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user