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: