fix: restore deleted_at mails when still on IMAP server — sync was permanently hiding mails

- When IMAP delete fails, deleted_at stays set but mail remains on IMAP server
- Sync was skipping deleted_at mails, so they stayed permanently hidden
- Now sync restores deleted_at=None when mail is found on IMAP server
- This means: if IMAP delete fails, mail reappears in LeoCRM on next sync
- Only truly deleted mails (removed from IMAP server) stay hidden
This commit is contained in:
Agent Zero
2026-07-20 13:46:48 +02:00
parent 04e0c60222
commit 7631698215
+9 -4
View File
@@ -662,9 +662,12 @@ async def imap_sync_folder(
).scalar_one_or_none() ).scalar_one_or_none()
if existing_mail: if existing_mail:
# Don't touch soft-deleted mails — they're being deleted via sync queue # If mail has deleted_at but is still on the IMAP server,
# the IMAP delete failed — restore it so it's visible again.
# This prevents mails from being permanently hidden when IMAP delete fails.
if existing_mail.deleted_at is not None: if existing_mail.deleted_at is not None:
continue existing_mail.deleted_at = None
logger.info("imap_sync_folder: restored mail %s (still on IMAP server, delete had failed)", existing_mail.id)
# Update folder_id and imap_uid if mail moved to a different folder # Update folder_id and imap_uid if mail moved to a different folder
if existing_mail.folder_id != folder.id: if existing_mail.folder_id != folder.id:
existing_mail.folder_id = folder.id existing_mail.folder_id = folder.id
@@ -1157,9 +1160,11 @@ async def imap_sync_account(
).scalar_one_or_none() ).scalar_one_or_none()
if existing_mail: if existing_mail:
# Don't touch soft-deleted mails — they're being deleted via sync queue # If mail has deleted_at but is still on the IMAP server,
# the IMAP delete failed — restore it so it's visible again.
if existing_mail.deleted_at is not None: if existing_mail.deleted_at is not None:
continue existing_mail.deleted_at = None
logger.info("imap_sync_account: restored mail %s (still on IMAP server, delete had failed)", existing_mail.id)
# Track folder moves: update folder_id and imap_uid if the # Track folder moves: update folder_id and imap_uid if the
# mail now appears in a different IMAP folder. # mail now appears in a different IMAP folder.
if existing_mail.folder_id != folder.id: if existing_mail.folder_id != folder.id: