From 084f821bc5edcbd90a0376860261b735eefcbe43 Mon Sep 17 00:00:00 2001 From: chahinebrini Date: Sat, 6 Jun 2026 08:43:59 +0200 Subject: [PATCH] fix(mail): incremental scan UID search returned seq-nums not UIDs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der inkrementelle Scan-Pfad rief imap.search({ uid: 'X:*' }) ohne das zweite { uid: true }-Argument auf → ImapFlow sendet "SEARCH UID X:*" statt "UID SEARCH UID X:*" → Server antwortet mit Sequence-Numbers. Die nachfolgende fetchAll(..., { uid: true }) interpretiert diese als UIDs → fetcht die falschen (alten) Mails → neu eingegangene Gambling- Mail (höchste echte UID) wird nie klassifiziert/gelöscht (>15min Lag). Auch Ursache des "Command Error. 10" Log-Spams (Mega-UID-Liste). Fix: { uid: true } als zweites search()-Argument. Co-Authored-By: Claude Opus 4.8 --- backend/server/api/mail/scan-internal.post.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/backend/server/api/mail/scan-internal.post.ts b/backend/server/api/mail/scan-internal.post.ts index c49ed9c..4f64815 100644 --- a/backend/server/api/mail/scan-internal.post.ts +++ b/backend/server/api/mail/scan-internal.post.ts @@ -197,13 +197,18 @@ export default defineEventHandler(async (event) => { let allMessages: any[]; if (lastUid > 0) { - // Inkrementell: nur UIDs > lastUid suchen - const newUids = await (imap as any).search({ uid: `${lastUid + 1}:*` }); + // Inkrementell: nur UIDs > lastUid suchen. + // WICHTIG: { uid: true } als zweites Argument ist Pflicht! + // Ohne es sendet ImapFlow "SEARCH UID X:*" statt "UID SEARCH UID X:*" + // → Server antwortet mit Sequence Numbers statt UIDs. + // fetchAll(..., { uid: true }) würde die Seq-Nums als UIDs interpretieren + // → fetcht falsche (alte) Mails → neue Mail wird übersehen. + const newUids = await (imap as any).search({ uid: `${lastUid + 1}:*` }, { uid: true }); if (!newUids || newUids.length === 0) { // Keine neuen Nachrichten → Ordner skippen, kein fetchAll nötig continue; } - // Fetch nur die neuen UIDs + // Fetch nur die neuen UIDs — newUids enthält jetzt echte UIDs allMessages = await imap.fetchAll(newUids.join(","), { envelope: true }, { uid: true } as any); } else { // Full-Sweep (erster Scan, UIDVALIDITY-Reset, oder Quality-Full-Sweep):