# rebreak-imap-idle Standalone IMAP IDLE Daemon für Rebreak. ## Was er macht - Hält pro aktiver `MailConnection` (DB) eine persistente IMAP-IDLE-Session - Reagiert in Echtzeit auf `EXISTS`-Events (neue Mail im Postfach) - Feuert bei jedem Event `POST /api/mail/scan-internal` gegen das lokale Backend - Das Backend entscheidet ob und welche Mails gelöscht werden (Gambling-Keywords + Blocklist) - Aktualisiert alle 5 min die Connection-Liste (neue User → neue Sessions, entfernte → geschlossen) - IDLE wird alle 25 min erneuert (RFC 3501 Server-Timeout liegt bei 29 min) ## Env-Vars | Variable | Pflicht | Beschreibung | |---------------------|---------|-----------------------------------------------------------| | `DATABASE_URL` | ja | Postgres-Connection-String (Supabase Pooler oder direkt) | | `ADMIN_SECRET` | ja | Shared Secret für /api/mail/scan-internal Header | | `ENCRYPTION_KEY` | ja | AES-256 Key (identisch zum Backend-Key, 32+ Zeichen) | | `BACKEND_URL` | nein | Default: http://127.0.0.1:3016 (staging) / 3015 (prod) | | `NODE_ENV` | nein | `production` → BACKEND_URL default port 3015 | ## Lokal starten (Entwicklung) ```bash cd backend/imap-idle npm install DATABASE_URL=<...> ADMIN_SECRET=<...> ENCRYPTION_KEY=<...> node index.mjs ``` Via Infisical (analog zu start-staging.sh): ```bash infisical run --env=staging -- node index.mjs ``` ## PM2 (Produktion) Wird via ecosystem.config.js gestartet — siehe `docs/internal/MAIL_DAEMON_DEPLOYMENT.md`. ## Logs (pm2) ``` [idle/] connected (imap.gmail.com:993) [idle/] exists-event received (new mail) [idle/] scan-triggered → scanned=12 blocked=1 [idle/] idle renewing (25min threshold) [idle/] reconnecting in 5s (attempt 2) [idle/db] refreshed — 47 active connections, 47 sessions ```