feat: add scheduler and mail outbox

SMTP adapter with TLS and a fake, outbox with retries, backoff, rate limit and restart safety, scheduler tick with job-run records started by gunicorn, and a send_test_mail command.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N3t4WL7bd9bdHHNjEsxzqC
This commit is contained in:
2026-10-18 09:18:42 +02:00
co-authored by Claude Sonnet 5.5
parent 0dc079a8ac
commit 20510a73e5
40 changed files with 1315 additions and 6 deletions
+14 -3
View File
@@ -6,9 +6,11 @@ from django.conf import settings
from .directory import Directory, LdapDirectory
from .idp import Idp, OidcIdp
from .mail import Mailer, SmtpMailer
_directory: Directory | None = None
_idp: Idp | None = None
_mailer: Mailer | None = None
def get_directory() -> Directory:
@@ -25,7 +27,16 @@ def get_idp() -> Idp:
return _idp
def install(directory: Directory | None = None, idp: Idp | None = None) -> None:
def get_mailer() -> Mailer:
global _mailer
if _mailer is None:
_mailer = SmtpMailer(settings.SMTP)
return _mailer
def install(
directory: Directory | None = None, idp: Idp | None = None, mailer: Mailer | None = None
) -> None:
"""Replace the adapters (tests). Passing None for one leaves it to be built on first use."""
global _directory, _idp
_directory, _idp = directory, idp
global _directory, _idp, _mailer
_directory, _idp, _mailer = directory, idp, mailer