Emails / logs : trace de remise + logging racine fiable

- deliver_many : log INFO « Emails remis : N/M — sujet=… » sur chaque lot
  (sans destinataire ni corps). Avant, un envoi réussi ne journalisait rien.
- configure_logging : basicConfig(force=True) pour que les logs app.* sortent
  dans la sortie du conteneur même quand uvicorn configure le logging avant
  l'import de app.main.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017uUsRg7XzopkCPWimwg9ZM
This commit is contained in:
AdamThomas
2026-09-10 19:42:34 +02:00
co-authored by Claude Sonnet 5
parent b84f62dfab
commit 9521034207
2 changed files with 13 additions and 0 deletions
+9
View File
@@ -73,10 +73,12 @@ def deliver_many(messages: list[EmailMessage]) -> None:
) )
return return
sent = 0
with smtp: with smtp:
for message in messages: for message in messages:
try: try:
smtp.send_message(message) smtp.send_message(message)
sent += 1
except smtplib.SMTPException as exc: except smtplib.SMTPException as exc:
# Ex. « 550 sender not authorized », « 535 auth failed ». # Ex. « 550 sender not authorized », « 535 auth failed ».
logger.error( logger.error(
@@ -84,6 +86,13 @@ def deliver_many(messages: list[EmailMessage]) -> None:
message["From"], message["From"],
exc, exc,
) )
# RGPD : ni destinataire ni corps, seulement le compte et le sujet.
logger.info(
"Emails remis : %d/%d — sujet=%r",
sent,
len(messages),
messages[0]["Subject"],
)
def send(to: str, subject: str, body: str) -> None: def send(to: str, subject: str, body: str) -> None:
+4
View File
@@ -9,7 +9,11 @@ from app.config import get_settings
def configure_logging() -> None: def configure_logging() -> None:
# `force=True` : on réinstalle le handler racine même si l'import de
# `app.main` se fait après la configuration de logging d'uvicorn/gunicorn,
# sinon les logs `app.*` n'apparaissent pas dans la sortie du conteneur.
logging.basicConfig( logging.basicConfig(
level=get_settings().log_level, level=get_settings().log_level,
format="%(asctime)s %(levelname)s %(name)s %(message)s", format="%(asctime)s %(levelname)s %(name)s %(message)s",
force=True,
) )