---
phase: quick-260921-oxm
plan: 01
type: tdd
autonomous: true
subsystem: apps/api/src/inbox
requirements: []
---
# Quick-Aufgabe 260921-oxm: IMAP-STARTTLS wirklich erzwingen und Anhangs-Dateinamen richtig lesen
## Ziel
Die beiden in 260921-m34 gemeldeten Befunde B-06 und B-05 in
`apps/api/src/inbox/imap.provider.ts` beheben — mit Tests, die gegen den
heutigen Stand rot sind, und ohne jede weitere Verhaltensaenderung.
## Ausgangsmessung (vor der Arbeit, gemessen am 21.09.2026 auf ad83407)
| Groesse | Wert |
|---|---:|
| `lint/suspicious/noExplicitAny` in `apps/api/src` | 15 |
| `lint/style/noNonNullAssertion` in `apps/api/src` | 56 |
| `as unknown as` in `apps/api/src` | 33 |
| `biome-ignore` in `apps/api/src` | 1 |
| `ts-expect-error` / `@ts-ignore` | 0 |
## Aufgabe 1 — B-06: STARTTLS erzwingen (sicherheitsrelevant)
imapflow 1.4.3 deklariert `doSTARTTLS?: boolean` in `ImapFlowOptions` (`lib/imap-flow.d.ts:81`).
**Test zuerst (rot):** Zwei Faelle in `imap.provider.spec.ts`, die die an
`new ImapFlow(...)` uebergebenen Optionen pruefen:
- `encryption: 'starttls'` ⇒ `secure === false`, `doSTARTTLS === true`, kein Feld `requireTLS`
- `encryption: 'ssl-tls'` ⇒ `secure === true`, `doSTARTTLS !== true` (Unvertraeglichkeit
der Bibliothek: `secure=true` zusammen mit `doSTARTTLS=true` wirft)
**Reparatur:** `requireTLS` durch `doSTARTTLS: config.encryption === 'starttls'`
ersetzen. Bei `ssl-tls` ergibt der Ausdruck `false` — das ist erlaubt und
dokumentiert ("STARTTLS explicitly disabled by config", `imap-flow.js:1210`) und
loest die Unvertraeglichkeit nicht aus, weil die nur bei `doSTARTTLS === true`
zuschlaegt (`imap-flow.js:1201`).
**Zusicherung:** `} as any` am Ende von `buildClient()` faellt ersatzlos, sobald
alle uebergebenen Felder deklariert sind. Danach pruefen.
## Aufgabe 2 — B-05: Anhangs-Dateiname aus dem richtigen Feld
imapflow deklariert `dispositionParameters?: { [key: string]: string }` (`lib/imap-flow.d.ts:450`) und fuellt es in `tools.js:887` mit kleingeschriebenen Schluesseln.
**Test zuerst (rot):** Ein `application/octet-stream`-Knoten, dessen
`dispositionParameters.filename` auf `.pdf` endet, muss von
`fetchPdfAttachments()` eingesammelt werden.
**Reparatur:** `(node as any).disposition?.parameters?.filename` durch den
getypten Zugriff `node.dispositionParameters?.filename` ersetzen.
## Verifikation
- `pnpm type-check` 4/4
- `pnpm lint` 5/5, keine Befunde der Schwere `error`
- `apps/api` mindestens 72 Dateien / 1143 Tests, `apps/web` 73/531
- Zaehler: `as unknown as` = 33, `noNonNullAssertion` = 56, `biome-ignore` = 1,
`ts-expect-error` = 0, `noExplicitAny` < 15
## Erfolgskriterien
- [ ] Beide Tests waren gegen den alten Stand nachweislich rot
- [ ] Keine Verhaltensaenderung ausser der in B-06 gewollten
- [ ] Keine neue Zusicherung, kein `!`, kein `@ts-expect-error`