메일 알림 시스템 추가

This commit is contained in:
Yun Chan 2026-06-29 17:07:01 +09:00
parent ddf12a851c
commit 3bf38c50df
22 changed files with 1769 additions and 31 deletions

View file

@ -219,6 +219,28 @@ class Settings(BaseSettings):
validation_alias="USER_UPLOAD_DIR",
)
# ── 운영 메일 알림 ─────────────────────────────────────
notification_email_provider: Literal["disabled", "smtp"] = Field(
default="disabled",
validation_alias="NOTIFICATION_EMAIL_PROVIDER",
)
notification_email_max_attempts: int = Field(
default=3,
validation_alias="NOTIFICATION_EMAIL_MAX_ATTEMPTS",
)
notification_email_retry_seconds: int = Field(
default=900,
validation_alias="NOTIFICATION_EMAIL_RETRY_SECONDS",
)
smtp_host: str = Field(default="", validation_alias="SMTP_HOST")
smtp_port: int = Field(default=587, validation_alias="SMTP_PORT")
smtp_username: str = Field(default="", validation_alias="SMTP_USERNAME")
smtp_password: str = Field(default="", validation_alias="SMTP_PASSWORD")
smtp_from_email: str = Field(default="", validation_alias="SMTP_FROM_EMAIL")
smtp_from_name: str = Field(default="Vignette", validation_alias="SMTP_FROM_NAME")
smtp_starttls: bool = Field(default=True, validation_alias="SMTP_STARTTLS")
smtp_ssl: bool = Field(default=False, validation_alias="SMTP_SSL")
# ── CORS (정적 프론트 + SSE 분리경로) ────────────────
cors_origins: list[str] = Field(
default=[
@ -278,9 +300,16 @@ class Settings(BaseSettings):
for origin in self.frontend_origin_map.values()
):
forbidden.append("FRONTEND_ORIGIN_MAP")
if self.notification_email_provider == "smtp":
if not self.smtp_host.strip():
forbidden.append("SMTP_HOST")
if not self.smtp_from_email.strip():
forbidden.append("SMTP_FROM_EMAIL")
if forbidden:
joined = ", ".join(forbidden)
raise ValueError(f"{joined} must be production-safe when ENVIRONMENT={self.environment}")
if self.smtp_ssl and self.smtp_starttls:
raise ValueError("SMTP_SSL and SMTP_STARTTLS cannot both be true")
if self.auth_saml_enabled:
missing_saml: list[str] = []
if not self.saml_sp_entity_id.strip():