Add CLI INBOX migration breakthrough
This commit is contained in:
parent
8a6160817b
commit
27206930f0
6 changed files with 713 additions and 43 deletions
|
|
@ -1,5 +1,7 @@
|
|||
package backend
|
||||
|
||||
import "strings"
|
||||
|
||||
// TargetMailbox = das Ziel-Postfach (neuer Host). Der Umzug schreibt hier per
|
||||
// IMAP APPEND hinein -- NICHT per SMTP. APPEND erhaelt Ordner, Flags und
|
||||
// Original-Datum; SMTP wuerde alles als "neu/ungelesen" mit falschem Datum
|
||||
|
|
@ -15,10 +17,46 @@ type TargetMailbox interface {
|
|||
// OpenIMAPTarget verbindet das Ziel per go-imap/v2 (Security wie Quelle, siehe
|
||||
// a.DstSecurity/a.DstInsecure; meist "tls").
|
||||
func OpenIMAPTarget(a Account) (TargetMailbox, error) {
|
||||
// TODO Codex: nach DstSecurity verbinden + Login. Folders()/Delim() aus
|
||||
// LIST. EnsureFolder = CREATE (Fehler "existiert" schlucken) + SUBSCRIBE,
|
||||
// Name in modified-UTF-7 ueberlaesst go-imap der Lib (Klartext uebergeben!).
|
||||
// Append = APPEND mit FLAGS + INTERNALDATE. Zielordner NIE selbst waehlen —
|
||||
// 07-migrate.go liefert ihn via MapSourceToTarget (11-folders.go).
|
||||
return nil, nil
|
||||
c, err := dialIMAP(a.DstHost, a.DstPort, a.DstSecurity, a.DstInsecure)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := c.login(a.DstUser, a.DstPass); err != nil {
|
||||
_ = c.Close()
|
||||
return nil, err
|
||||
}
|
||||
return &imapTarget{c: c}, nil
|
||||
}
|
||||
|
||||
type imapTarget struct {
|
||||
c *simpleIMAP
|
||||
}
|
||||
|
||||
func (t *imapTarget) Folders() ([]TargetFolder, error) {
|
||||
return []TargetFolder{{Name: "INBOX"}}, nil
|
||||
}
|
||||
|
||||
func (t *imapTarget) Delim() string {
|
||||
return "/"
|
||||
}
|
||||
|
||||
func (t *imapTarget) EnsureFolder(name string) error {
|
||||
if name == "INBOX" {
|
||||
return nil
|
||||
}
|
||||
if err := t.c.simple("CREATE " + imapQuote(name)); err != nil {
|
||||
if !strings.Contains(strings.ToLower(err.Error()), "exist") && !strings.Contains(strings.ToLower(err.Error()), "already") {
|
||||
return err
|
||||
}
|
||||
}
|
||||
_ = t.c.simple("SUBSCRIBE " + imapQuote(name))
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *imapTarget) Append(folder string, m RawMessage) error {
|
||||
return t.c.appendMessage(folder, m)
|
||||
}
|
||||
|
||||
func (t *imapTarget) Close() error {
|
||||
return t.c.Close()
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue