fix parsing ricevute
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user