fix parsing ricevute

This commit is contained in:
2026-06-18 16:31:29 +02:00
parent 4c90a7c1a3
commit 058c550cd2
10 changed files with 731 additions and 15 deletions
+34 -1
View File
@@ -24,6 +24,7 @@ import json
import logging
import uuid as uuid_module
from datetime import datetime, timedelta, timezone
from email.utils import make_msgid
from typing import Any
from sqlalchemy import select
@@ -135,6 +136,35 @@ async def send_pec(ctx: dict[str, Any], send_job_id: str) -> dict:
)
# Continua senza questo allegato
# ── Pre-genera Message-ID e commita PRIMA dell'invio SMTP ─────────────
# RACE CONDITION FIX: il Message-ID viene scritto nel DB e committato
# PRIMA dell'handshake SMTP, in modo che, se il ciclo IMAP sync del
# worker gira durante l'invio (finestra di secondi), trovi gia' il
# record con message_id_header valorizzato e possa bindare correttamente
# le ricevute di accettazione (da Aruba: entro 1-2s dalla ricezione).
# Senza questo fix la ricevuta di accettazione veniva sempre processata
# con message_id_header=NULL nel DB → binding fallisce → parent_message_id
# non impostato sulla ricevuta → ricevuta compare in inbox come messaggio
# ordinario e lo stato outbound non avanza ad "accepted".
if not msg.message_id_header:
# Primo tentativo: genera e persiste un nuovo Message-ID
pre_generated_id = make_msgid(domain="pechub.local")
msg.message_id_header = pre_generated_id
await db.commit()
logger.info(
f"[send_pec] Message-ID pre-committato prima dell'SMTP: "
f"{pre_generated_id}"
)
else:
# Retry successivo: riusa il Message-ID gia' persistito dal
# tentativo precedente. In questo modo eventuali ricevute gia'
# salvate (ma non bindato per la race) possono essere ricollegate.
pre_generated_id = msg.message_id_header
logger.debug(
f"[send_pec] Retry - riutilizzo Message-ID esistente: "
f"{pre_generated_id}"
)
# ── Tenta invio SMTP ──────────────────────────────────────────────────
try:
sender = SmtpSender(mailbox)
@@ -145,11 +175,14 @@ async def send_pec(ctx: dict[str, Any], send_job_id: str) -> dict:
body_text=msg.body_text or "",
body_html=msg.body_html,
attachments=attachments_data,
preset_message_id=pre_generated_id,
)
# ── Successo: aggiorna DB ─────────────────────────────────────────
# msg.message_id_header e' gia' impostato e committato sopra.
# message_id_header restituito dal sender deve essere identico a
# pre_generated_id (stessa stringa che abbiamo passato).
now = datetime.now(tz=timezone.utc)
msg.message_id_header = message_id_header
msg.state = "sent"
msg.sent_at = now