package backend import "time" // RawMessage ist eine 1:1 aus der Quelle geholte Nachricht: der Rohkoerper // plus die Metadaten, die den sauberen Umzug ausmachen. type RawMessage struct { MessageID string // aus Header, Schluessel fuer Idempotenz Body []byte // kompletter RFC822-Rohtext, wird NICHT umgeschrieben Flags []string // \Seen \Answered \Flagged ... 1:1 uebernehmen InternalDate time.Time // Original-Zeit, per APPEND erhalten } // Folder ist ein Ordner der Quelle MIT den Infos, die 11-folders.go fuer die // Rollen-Zuordnung braucht: dekodierter Name (Umlaute als Klartext, NICHT // modified-UTF-7), SPECIAL-USE-Attribute und der Hierarchie-Trenner. type Folder struct { Name string // dekodiert, z.B. "Gelöschte Objekte" oder "INBOX.Sent" Attrs []string // z.B. ["\\Sent"] aus SPECIAL-USE Delim string // "." oder "/" — servereigener Trenner } // SourceMailbox abstrahiert Quelle (IMAP primaer, POP3 Fallback), damit // 07-migrate.go gegen ein Interface arbeitet. type SourceMailbox interface { Folders() ([]Folder, error) // rekursiver Ordnerbaum Fetch(folder string) ([]RawMessage, error) // Stream: BODY[] FLAGS INTERNALDATE Close() error } // OpenIMAPSource verbindet die Quelle per go-imap/v2. // // Verschluesselung nach a.SrcSecurity: // - "tls": imapclient.DialTLS (impliziter TLS, Port 993) // - "starttls": imapclient.DialStartTLS auf Klartext-Port 143 // - "none": imapclient.Dial (REINER KLARTEXT, alte Provider!) // // a.SrcInsecure -> tls.Config{InsecureSkipVerify:true} fuer kaputte/selbst- // signierte Zerts. go-imap dekodiert modified-UTF-7-Ordnernamen selbst; wir // geben in Folder.Name den Klartext weiter. func OpenIMAPSource(a Account) (SourceMailbox, error) { // TODO Codex: nach SrcSecurity verbinden, Login, imapSource zurueckgeben. // Folders() = LIST "" "*" mit SPECIAL-USE + Delim; Fetch() = SELECT + // UID FETCH BODY[] FLAGS INTERNALDATE, streamend um RAM zu schonen. return nil, nil }