IMAP-Fehler: zentraler Humanizer + Auth-Fehler explizit

Der User sah beim Postfach-Sync stumpf "Command failed" – realer
Grund war ein abgelaufenes Postfach-Passwort. Der Bug betraf
Anhang-Download UND Sync und war der gleiche wie 2 Commits zuvor:
imapflow wirft `new Error('Command failed')` und legt Details in
`.responseText`/`.responseStatus` ab, wir haben sie nirgends
gelesen.

Fix: humanizeImapError() als zentraler Helper in imapService:
- Extrahiert responseText/responseStatus aus imapflow-Errors
- Erkennt Auth-Fehler ("authentication failed", "invalid
  credentials", NO+auth) und liefert klare Meldung mit
  Handlungsanweisung: "Passwort stimmt nicht mehr, bitte
  Zugangsdaten synchronisieren".
- Deckt zusätzlich Netzwerk/TLS/Timeout/UID-Stale ab.

Angewendet auf:
- fetchAttachmentInner (Anhang-Fetch)
- downloadAttachment-Controller (Response an UI)
- syncEmailsForAccount (Sync-Ergebnis + Toast)

Damit sieht der User im Toast künftig statt "Command failed" die
tatsächliche Ursache – gleicher Mechanismus für Sync und
Anhang-Download.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-07-11 15:28:43 +02:00
co-authored by Claude Opus 4.7
parent be19e60a1b
commit f2703ed6b7
3 changed files with 77 additions and 37 deletions
+6 -3
View File
@@ -4,7 +4,7 @@
import { CachedEmail, Prisma, EmailFolder } from '@prisma/client';
import prisma from '../lib/prisma.js';
import { decrypt } from '../utils/encryption.js';
import { fetchEmails, ImapCredentials, FetchedEmail, moveToTrash, restoreFromTrash, permanentDelete } from './imapService.js';
import { fetchEmails, ImapCredentials, FetchedEmail, moveToTrash, restoreFromTrash, permanentDelete, humanizeImapError } from './imapService.js';
import { getImapSmtpSettings } from './emailProvider/emailProviderService.js';
// ==================== TYPES ====================
@@ -155,12 +155,15 @@ export async function syncEmailsForAccount(
};
} catch (error) {
console.error('syncEmailsForAccount error:', error);
const errorMessage = error instanceof Error ? error.message : 'Unbekannter Fehler';
// humanizeImapError zieht die eigentliche Server-Antwort aus dem
// imapflow-Error und erkennt insbesondere Auth-Fehler ("Passwort
// stimmt nicht mehr") mit klarer Handlungsanweisung vorher sah
// der User im Sync-Toast nur "Command failed".
return {
success: false,
newEmails: 0,
totalEmails: 0,
error: errorMessage,
error: humanizeImapError(error),
};
}
}