Teil 12 der grommunio-2026-Serie zeigt eine generische IMAP-Migration nach grommunio mit imapsync. Getestet wurde der komplette Ablauf mit Source-Inventur, vorbereitetem grommunio-Ziel, Initial Sync, Delta Sync, Resume-Test, Bulk-Lauf und Web-Validierung.

Kurzüberblick

Source: isolierter Dovecot-IMAP-Server mit realistischen Testmailboxen.

Target: grommunio Appliance 2026.06.1 mit gromox 3.10.123.

Tooling: imapsync 2.229 direkt aus den Paketen grommunio-imapsync und imapsync.

Ergebnis: Initial Sync, Delta Sync, Idempotenz, Resume, Bulk und Web-Validierung sind erfolgreich abgeschlossen.

Was IMAP migriert und was nicht

IMAP migriert Mailbox-Inhalte, Ordnerstrukturen, typische Message-Flags, interne Nachrichtendaten und Anhänge. IMAP migriert nicht automatisch Kalender, Kontakte, Aufgaben, serverseitige Regeln, Sieve-Regeln, Delegationen, Shared-Mailbox-Rechte, Public Folders, GAL, Identitäten, Passwörter oder mobile Geräteprofile.

Getestete Umgebung

  • grommunio-release 2026.06.1
  • gromox 3.10.123
  • grommunio-imapsync 2.229
  • imapsync 2.229
  • Source-IMAP per Dovecot im isolierten Lab

Source-Baseline

Die Source-Mailbox enthielt Inbox, Sent, Drafts, Trash, Junk, Archive, Custom Folder, Nested Folder, gelesene und ungelesene Nachrichten, markierte Nachrichten, historische Datumswerte, HTML, Plain Text, Anhänge und UTF-8-Betreffzeilen.

json
{
"source": "alice@example.test",
"state": "before initial sync",
"totalMessages": 12,
"folders": {
"INBOX": {
"messages": 6,
"unread": 4,
"flagged": 1,
"sampleFlags": [
"\\Recent",
"\\Seen \\Recent",
"\\Flagged \\Recent"
]
},
"Drafts": {
"messages": 1,
"sampleFlags": [
"\\Draft \\Recent"
]
},
"Sent": {
"messages": 1,
"sampleFlags": [
"\\Seen \\Recent"
]
},
"Trash": {
"messages": 1,
"sampleFlags": [
"\\Seen \\Recent"
]
},
"Junk": {
"messages": 1,
"sampleFlags": [
"\\Recent"
]
},
"Projects": {
"messages": 1,
"sampleFlags": [
"\\Recent"
]
},
"Projects/2024": {
"messages": 1,
"sampleFlags": [
"\\Answered \\Recent"
]
},
"Archive": {
"messages": 0
}
},
"attachments": [
"migration-proof.txt",
"larger-attachment.bin"
]
}

grommunio-Ziel vorbereiten

Vor dem Sync wurden Domain, Benutzer, Mailboxen, Passwörter, IMAP-Rechte und Web-Zugriff vorbereitet. imapsync legt keine vollständige grommunio-Identity-Struktur an.

json
{
"target": "alice@example.test",
"state": "before initial sync",
"totalMessages": 0,
"folders": {
"INBOX": 0,
"Drafts": 0,
"Sent Items": 0,
"Deleted Items": 0,
"Junk Email": 0
}
}

imapsync auf grommunio prüfen

bash
rpm -q grommunio-imapsync imapsync
imapsync --version

In diesem Lab war imapsync über grommunio-Pakete vorhanden. Der getestete Hauptweg ist deshalb imapsync direkt auf der Appliance.

Initial Sync

bash
imapsync --host1 source.example.test --port1 993 --ssl1 --user1 alice@example.test --passfile1 /root/imapsync-lab/secrets/alice-source.pass --host2 mail.example.test --port2 993 --ssl2 --user2 alice@example.test --passfile2 /root/imapsync-lab/secrets/alice-target.pass --automap --subscribe
bash
Initial sync: PASS
Host1 -> Host2: source IMAP -> grommunio IMAP
Messages transferred : 12
Messages skipped : 0
Detected errors : 0
Return value : 0 (EX_OK)
Folder mapping : Sent -> Sent Items, Trash -> Deleted Items, Junk -> Junk Email

Delta Sync und Idempotenz

Nach dem Initial Sync wurden zwei neue Inbox-Nachrichten, ein neuer Ordner und eine Flag-Änderung in der Source erzeugt. Der zweite imapsync-Lauf übernahm nur die Delta-Daten und duplizierte den Altbestand nicht.

json
{
"deltaSync": "PASS",
"transferred": 3,
"skipped": 12,
"errors": 0,
"targetAfterDelta": {
"totalMessages": 15,
"flagged": 3,
"folders": {
"INBOX": {
"messages": 8,
"flagged": 2,
"sampleFlags": [
"\\Flagged",
"\\Seen",
""
]
},
"Delta/NewFolder": {
"messages": 1,
"flagged": 1,
"sampleFlags": [
"\\Flagged"
]
},
"Drafts": {
"messages": 1,
"sampleFlags": [
"\\Draft"
]
},
"Projects/2024": {
"messages": 1,
"sampleFlags": [
"\\Answered"
]
}
}
}
}

Anhang und Web-Validierung

Nach der Migration wurde grommunio Web geöffnet. Die migrierte Ordnerstruktur, die Delta-Mail und eine Nachricht mit Anhang waren sichtbar.

Resume, Bulk und Negativtest

Ein Lauf wurde absichtlich unterbrochen und anschließend erneut gestartet. Der Rerun beendete die Mailbox vollständig ohne unkontrollierte Duplikate. Zusätzlich wurden mehrere Benutzer nacheinander synchronisiert und ein falsches Source-Passwort als Negativtest geprüft.

bash
Resume test: PASS
Interrupted first run: intentionally stopped
Rerun transferred : 179
Rerun skipped : 3
Final target count : 182/182 messages
Detected errors : 0
Return value : 0 (EX_OK)
bash
Negative test: PASS
Scenario : wrong source password
Result : source login rejected
IMAP response: NO [AUTHENTICATIONFAILED] Authentication failed
Return value : 161 (EXIT_AUTHENTICATION_FAILURE_USER1)

Cutover-Modell

  • Initial Sync vor dem Umschaltfenster ausführen.
  • Zielbenutzer und grommunio Web testen.
  • Mailflow separat umstellen; MX ist nicht imapsync.
  • Benutzerzugriff auf die Source kontrollieren oder einfrieren.
  • Final Delta Sync ausführen.
  • grommunio Web und Clients validieren.

Ergebniskontrolle / Technische Abnahme

Tooling

Prüfung
grommunio-imapsync und imapsync prüfen
Erwartetes Ergebnis
imapsync ist auf der Appliance nutzbar
Status
PASS

Initial Sync

Prüfung
Pilot-Mailbox synchronisieren
Erwartetes Ergebnis
Ordner, Mails, Flags, Daten und Anhänge sind im Ziel vorhanden
Status
PASS

Delta Sync

Prüfung
Neue Source-Mails und Flag-Änderung übernehmen
Erwartetes Ergebnis
Nur Delta wird ergänzt, keine Duplikate
Status
PASS

Resume

Prüfung
Unterbrochenen Lauf wiederholen
Erwartetes Ergebnis
Rerun vervollständigt die Mailbox
Status
PASS

Bulk

Prüfung
Mehrere Benutzer synchronisieren
Erwartetes Ergebnis
Weitere Postfächer werden erfolgreich migriert
Status
PASS

Web

Prüfung
grommunio Web prüfen
Erwartetes Ergebnis
Migrierte Mails, Ordner und Anhänge sind sichtbar
Status
PASS

Fazit

Die generische IMAP-Migration zu grommunio ist mit imapsync reproduzierbar abnahmefähig, wenn Zielbenutzer vorbereitet sind, Passwortdateien statt Klartext in der Shell verwendet werden, Ordner-Mapping kontrolliert wird und ein Delta-/Cutover-Modell sauber geplant ist.