"""Magic-link delivery. SMTP when configured, dev log fallback otherwise. Mail design follows the web branding (see frontend/src/theme.ts): kirchenblau header, serif headline, white card on paper background. Email-safe by construction: table layout, inline styles only, system fonts, no external images (many clients block them / track opens). """ from __future__ import annotations import logging import smtplib from email.message import EmailMessage from app.settings import settings logger = logging.getLogger(__name__) # Brand palette (mirrors frontend/src/theme.ts kirchenblau). BLUE = "#1d4a79" BLUE_LIGHT = "#eef4fb" INK = "#162f4c" MUTED = "#5b6b7c" def magic_link(token: str) -> str: return f"{settings.frontend_url.rstrip('/')}/login?token={token}" def _page(title: str, intro: str, button_label: str, button_url: str | None, note: str) -> str: """Branded HTML mail body (table layout, inline styles, no images).""" button = "" if button_url: button = ( '
| ' f'{button_label} |
|
{note} |