fix: mail delivery never fails requests after commit

This commit is contained in:
Jonas Miederer 2026-09-12 07:44:36 +02:00
parent 62d01b5097
commit 6e12720ad6
3 changed files with 62 additions and 12 deletions

View file

@ -15,9 +15,21 @@ def magic_link(token: str) -> str:
return f"{settings.frontend_url.rstrip('/')}/login?token={token}"
def _send(message: EmailMessage) -> None:
with smtplib.SMTP(settings.smtp_host, settings.smtp_port, timeout=10) as smtp:
smtp.starttls()
if settings.smtp_username:
smtp.login(settings.smtp_username, settings.smtp_password)
smtp.send_message(message)
def send_magic_link(to_email: str, link: str) -> bool:
"""Mail the login link. Returns False (logs instead) when SMTP is unset.
Never raises: callers invoke it after committing (approve/bootstrap),
so a delivery failure must not turn into a 500 — the token stays valid
and the admin sees ``email_sent: false``.
The plaintext link only ever appears here: service/api logging must
never include tokens or session ids (see test_auth no-leak test).
"""
@ -33,11 +45,11 @@ def send_magic_link(to_email: str, link: str) -> bool:
message.set_content(
f"Hello,\n\nUse this link to log in (valid 15 minutes, single use):\n{link}\n"
)
with smtplib.SMTP(settings.smtp_host, settings.smtp_port, timeout=10) as smtp:
smtp.starttls()
if settings.smtp_username:
smtp.login(settings.smtp_username, settings.smtp_password)
smtp.send_message(message)
try:
_send(message)
except Exception: # noqa: BLE001 - delivery is best effort, see docstring
logger.warning("magic-link delivery failed for %s", to_email)
return False
logger.info("magic link mailed to %s", to_email)
return True
@ -55,12 +67,8 @@ def send_access_notification(request_id: str, name: str, email: str) -> bool:
f"Name: {name}\nEmail: {email}\nRequest: {request_id}\n"
)
try:
with smtplib.SMTP(settings.smtp_host, settings.smtp_port, timeout=10) as smtp:
smtp.starttls()
if settings.smtp_username:
smtp.login(settings.smtp_username, settings.smtp_password)
smtp.send_message(message)
except OSError:
_send(message)
except Exception: # noqa: BLE001 - best effort, request is already stored
logger.warning("access-request notification failed for %s", request_id)
return False
return True