55 lines
1.9 KiB
Python
55 lines
1.9 KiB
Python
|
|
"""
|
||
|
|
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, så 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 på
|
||
|
|
forhånd: implisitt TLS (SMTP_SSL, typisk port 465) eller STARTTLS på 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
|
||
|
|
på (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)
|