fix(mail): incremental scan UID search returned seq-nums not UIDs

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 <noreply@anthropic.com>
This commit is contained in:
chahinebrini 2026-06-06 08:43:59 +02:00
parent 1f73bd8d8d
commit 084f821bc5

View File

@ -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):