Scheduler für periodischen IMAP-Postfach-Abruf mit UID-basiertem Delta-Sync: neue Nachrichten erkennen, Zustandsänderungen abgleichen. - imap (ING-01) minimal erweitert: Message.UID, MailboxStore.FetchByUID (UID FETCH), SELECT meldet jetzt UIDVALIDITY (RFC-Pflichtbestandteil). Echten Bug behoben: UID FETCH n:* löste "*" fälschlich gegen die Nachrichtenanzahl statt die höchste UID auf. - imapimport/state.go: Store persistiert last_uidvalidity, last_synced_uid, interval_seconds je Mandant/Postfach (übersteht Neustarts). - imapimport/scheduler.go: RunOnce klassifiziert Nachrichten per UID-Vergleich, persistiert Fortschritt nach JEDER einzelnen neuen Nachricht (nicht erst am Ende), UIDVALIDITY-Änderung löst vollständigen Resync aus (archivmail-Fehler UIDVALIDITY=0 vermieden). - imapimport/client_real.go: echtes IMAP4rev1 über TCP (LOGIN/SELECT/UID FETCH/LOGOUT). Prüfungen (alle real durchgeführt, siehe mail/docs/IMP-01-PRUEFPROTOKOLL.md): 1. TestRunOnce_TwoConsecutiveRunsNoDuplicateImport: zweiter Lauf real 0 neue Nachrichten. 2. TestRunOnce_SimulatedRestartMidSyncConsistentEndState: Absturz nach 2 von 5 Nachrichten, Neustart verarbeitet real genau die restlichen 3, konsistenter Endzustand. 3. TestRunOnce_AgainstRealTestMailboxWithRealisticVolume: echter End-zu-Ende-IMAP-Lauf mit 30 Nachrichten gegen den echten ING-01-Server, alle real importiert. Kein Umbau: mail/internal/folderstate (ING-05) unverändert. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HhgFcLS8tYMhDJpP74C6AQ
25 lines
998 B
Go
25 lines
998 B
Go
package imapimport
|
|
|
|
import "context"
|
|
|
|
// RemoteMessage ist eine über IMAP abgerufene Nachricht (nur UID/Flags —
|
|
// Inhaltsabruf ist Sache späterer Kacheln, siehe "Nicht Bestandteil
|
|
// dieser Kachel": IMP-02 Anhangsverarbeitung u. a.).
|
|
type RemoteMessage struct {
|
|
UID uint32
|
|
Flags []string
|
|
}
|
|
|
|
// IMAPClient abstrahiert den Protokollzugriff auf ein entferntes
|
|
// Postfach — schmale Schnittstelle, damit die Delta-Sync-Logik
|
|
// (scheduler.go) ohne echte Netzwerkverbindung testbar ist (gleiche
|
|
// Konvention wie KEKProvider/Authenticator in anderen Mail-Paketen).
|
|
// Eine reale, wire-level-IMAP4rev1-Implementierung liegt in client_real.go.
|
|
type IMAPClient interface {
|
|
// Sync liefert die aktuelle UIDVALIDITY des Postfachs sowie ALLE
|
|
// darin vorhandenen Nachrichten (UID + Flags). Der Aufrufer
|
|
// (Scheduler) entscheidet anhand des persistierten Zustands, welche
|
|
// davon neu sind.
|
|
Sync(ctx context.Context, mailbox string) (uidvalidity uint64, messages []RemoteMessage, err error)
|
|
}
|