From 7631698215ab01c49f3094ff3fb5562bbb3173d6 Mon Sep 17 00:00:00 2001 From: Agent Zero Date: Mon, 20 Jul 2026 13:46:48 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20restore=20deleted=5Fat=20mails=20when=20?= =?UTF-8?q?still=20on=20IMAP=20server=20=E2=80=94=20sync=20was=20permanent?= =?UTF-8?q?ly=20hiding=20mails?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- app/plugins/builtins/mail/services.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/plugins/builtins/mail/services.py b/app/plugins/builtins/mail/services.py index 3f5f737..8027789 100644 --- a/app/plugins/builtins/mail/services.py +++ b/app/plugins/builtins/mail/services.py @@ -662,9 +662,12 @@ async def imap_sync_folder( ).scalar_one_or_none() 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: - 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 if 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() 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: - 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 # mail now appears in a different IMAP folder. if existing_mail.folder_id != folder.id: