Stream source mailbox migration

This commit is contained in:
DonVoo 2026-07-14 17:56:33 +02:00
parent f5f0ff1b8c
commit a52963c380
4 changed files with 179 additions and 33 deletions

View file

@ -123,52 +123,53 @@ func migrateAccount(a Account, selectedFolders map[string]bool) error {
if dstFolder == "" {
dstFolder = folder.Name
}
msgs, err := src.Fetch(folder.Name)
if err != nil {
errs++
log.Printf("%s %s fetch error: %v", a.Name, folder.Name, err)
continue
}
total += len(msgs)
if err := dst.EnsureFolder(dstFolder); err != nil {
errs++
log.Printf("%s %s ensure target %s error: %v", a.Name, folder.Name, dstFolder, err)
continue
}
folderDone, folderErrs := 0, 0
for _, m := range msgs {
folderTotal := 0
if err := src.Fetch(folder.Name, func(m RawMessage) error {
total++
folderTotal++
already, err := AlreadyCopied(a.ID, folder.Name, m.MessageID)
if err != nil {
errs++
folderErrs++
log.Printf("%s %s dedup error %s: %v", a.Name, folder.Name, m.MessageID, err)
continue
return nil
}
if already {
continue
return nil
}
if err := dst.Append(dstFolder, m); err != nil {
errs++
folderErrs++
log.Printf("%s %s append to %s error %s: %v", a.Name, folder.Name, dstFolder, m.MessageID, err)
continue
return nil
}
if err := mbox.Append(folder.Name, m); err != nil {
errs++
folderErrs++
log.Printf("%s %s mbox error %s: %v", a.Name, folder.Name, m.MessageID, err)
continue
return nil
}
if err := MarkCopied(a.ID, folder.Name, m.MessageID); err != nil {
errs++
folderErrs++
log.Printf("%s %s mark error %s: %v", a.Name, folder.Name, m.MessageID, err)
continue
return nil
}
done++
folderDone++
return nil
}); err != nil {
errs++
folderErrs++
log.Printf("%s %s fetch error: %v", a.Name, folder.Name, err)
}
log.Printf("migration %s %s -> %s: total=%d copied=%d errors=%d", a.Name, folder.Name, dstFolder, len(msgs), folderDone, folderErrs)
log.Printf("migration %s %s -> %s: total=%d copied=%d errors=%d", a.Name, folder.Name, dstFolder, folderTotal, folderDone, folderErrs)
}
state := "success"
if errs > 0 {
@ -209,12 +210,15 @@ func CheckAccount(name string) error {
}
total := 0
for _, folder := range folders {
msgs, err := src.Fetch(folder.Name)
if err != nil {
folderTotal := 0
if err := src.Fetch(folder.Name, func(m RawMessage) error {
folderTotal++
return nil
}); err != nil {
return fmt.Errorf("fetch source %s %s: %w", a.Name, folder.Name, err)
}
log.Printf("account %s source folder %s messages=%d", a.Name, folder.Name, len(msgs))
total += len(msgs)
log.Printf("account %s source folder %s messages=%d", a.Name, folder.Name, folderTotal)
total += folderTotal
}
dst, err := OpenIMAPTarget(a)
if err != nil {