Mail-Graveyard/backend/04-imap-source.go
2026-07-05 17:58:25 +02:00

46 lines
2 KiB
Go

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
}