teecup/app/email.py

55 lines
1.9 KiB
Python
Raw Normal View History

"""
E-postutsending for TeeCup. I dag kun magic-link-innlogging.
Egne, uavhengige SMTP-credentials fra teeoff (ADR-009) -- se .env
(TEECUP_SMTP_SERVER/PORT/USER/PASS, TEECUP_FROM_EMAIL). `smtplib` er
synkron, selve sendingen kjøres i en tråd (asyncio.to_thread) for ikke å
blokkere event loop-en -- samme mønster som teeoffs egen, fungerende
magic-link-utsending.
Håndterer BEGGE vanlige SMTP-tilkoblingsmåter siden porten ikke er antatt
forhånd: implisitt TLS (SMTP_SSL, typisk port 465) eller STARTTLS en
vanlig tilkobling (typisk port 587/25).
"""
import smtplib
from asyncio import to_thread
from email.message import EmailMessage
from .config import settings
def _send_sync(to_email: str, subject: str, body: str) -> None:
msg = EmailMessage()
msg["Subject"] = subject
msg["From"] = settings.FROM_EMAIL
msg["To"] = to_email
msg.set_content(body)
if settings.SMTP_PORT == 465:
with smtplib.SMTP_SSL(settings.SMTP_SERVER, settings.SMTP_PORT) as smtp:
smtp.login(settings.SMTP_USER, settings.SMTP_PASS)
smtp.send_message(msg)
else:
with smtplib.SMTP(settings.SMTP_SERVER, settings.SMTP_PORT) as smtp:
smtp.starttls()
smtp.login(settings.SMTP_USER, settings.SMTP_PASS)
smtp.send_message(msg)
async def send_magic_link_email(to_email: str, raw_token: str) -> None:
"""Sender selve magic-link-tokenet som klartekst.
MERK: ingen klikkbar lenke ennå -- TeeCup har ikke noe frontend å peke
(se plan). Når frontend bygges, oppdater malen til en ekte URL.
"""
subject = "Logg inn på TeeCup"
body = (
"Hei,\n\n"
f"Bruk denne koden for å logge inn på TeeCup innen "
f"{settings.MAGIC_LINK_MAX_AGE_MINUTES} minutter:\n\n"
f"{raw_token}\n\n"
"Ba du ikke om dette, kan du se bort fra e-posten.\n"
)
await to_thread(_send_sync, to_email, subject, body)