← Terug naar kennisbank E-MAIL

IMAPsync — mailboxes verhuizen zonder mailverlies

IMAPsync is het stuk gereedschap waarmee 90% van de serieuze e-mail-migraties wereldwijd wordt gedaan. Geen GUI, geen abonnement, geen wachtende ondersteuning — gewoon één command-line tool die al sinds 2007 met zo'n beetje elke IMAP-server praat. Deze handleiding gaat over wat 't doet, hoe je 'm installeert en welke valkuilen ik tegenkom bij dagelijks gebruik in mailbox-migraties voor klanten.

Mailbox-migraties komen in twee smaken: één waar de hoster van het oude pakket de export voor je doet (zeldzaam, vaak duur), en één waar je twee IMAP-credential-sets in de hand hebt en moet zorgen dat de inhoud van A naar B komt. De tweede smaak is veruit het vaakst — en daar is IMAPsync in 2007 specifiek voor geschreven door Gilles Lamiral. Sindsdien is het gepolijst tot een tool die werkt waar bijna alles anders breekt.

Wat het concreet doet: een éénrichtings-kopie van mailbox-A naar mailbox-B met behoud van mappenstructuur, originele datums, gelezen/ongelezen-status, vlaggen, en bijlagen. Dubbele mails worden overgeslagen op basis van Message-ID-vergelijking. Onderbroken? Hervat met één flag.

Wanneer gebruik je IMAPsync

Concrete scenario's waar dit jouw oplossing is:

  • Hosting-migratie: van TransIP naar Antagonist, van Hostnet naar Vimexx, of welke combinatie dan ook waar mailboxes mee moeten
  • Overstap naar Microsoft 365 of Google Workspace: oude IMAP-mailbox naar moderne suite, met behoud van archief
  • Mailserver-upgrade: van een zelf-gehoste oude Cyrus of Dovecot naar een nieuwe omgeving
  • Provider stopt met e-mail: noodgedwongen verhuizen omdat je hoster de mail-service afkapt
  • Backup-doeleinden: periodiek een complete kopie naar een onafhankelijke IMAP-account
  • Hack-recovery: gehackte mailbox éérst dump-en met IMAPsync zodat je de inhoud veilig hebt voordat je de oude wegblaast

Wanneer NIET: als je geen IMAP-toegang hebt op één van de twee kanten (POP3-only, of webmail zonder IMAP). Dan zijn er andere oplossingen, maar dat is een ander verhaal.

Installatie

IMAPsync zelf is een Perl-script. Daar moet je dus Perl plus een aantal Perl-modules voor hebben. Hieronder de drie meest gebruikte installatie-routes.

Linux (Debian / Ubuntu)

sudo apt update
sudo apt install imapsync

Klaar. Op moderne Debian/Ubuntu zit IMAPsync in de standaard repositories.

macOS

Via Homebrew:

brew install imapsync

Op een Mac werkt 't out-of-the-box mits je Homebrew hebt; verder geen Perl-gedoe.

Docker (cross-platform, geen lokale installatie)

De officiele Docker-image is handig als je niet wilt rommelen met Perl-modules:

docker run --rm gilleslamiral/imapsync imapsync --version

Bij het draaien van een echte sync mount je dan de werkdirectory:

docker run --rm -v "$(pwd):/imapsync-data" \
  gilleslamiral/imapsync imapsync \
  --host1 oude.server.nl --user1 info@example.com --password1 'oudpw' \
  --host2 nieuwe.server.nl --user2 info@example.com --password2 'nieuwpw'

Windows

Officiele Windows-binary bestaat, maar in de praktijk: gebruik WSL2 met Ubuntu en installeer daar via apt. Veel minder gedoe dan native Windows.

Basis-commando

Het minimum-viable commando heeft vier parameters in dubbel: host + user + password voor zowel kant 1 (oud) als kant 2 (nieuw):

imapsync \
  --host1 mail.oude-provider.nl --user1 info@example.com --password1 'oudpw' \
  --host2 mail.nieuwe-provider.nl --user2 info@example.com --password2 'nieuwpw'

Dit start direct met kopiëren. Je ziet voortgang per map en mail in de terminal. Bij voltooiing krijg je een summary met aantal gekopieerde mails, overgeslagen mails en eventuele fouten.

Wachtwoorden in shell-history: bovenstaand voorbeeld zet wachtwoorden direct in je commando, wat ze in ~/.bash_history achterlaat. Voor productie-runs: zet ze in een file met chmod 600 en gebruik --password1file en --password2file. Of via environment-variabelen met --passfile1. Standaard goede gewoonte.

De flags die je in de praktijk altijd nodig hebt

Het basis-commando werkt, maar in 80% van de migraties heb je deze flags ook nodig:

--dry — eerst testen zonder te schrijven

Doet alle handelingen behalve daadwerkelijk mails kopiëren. Geeft je een precieze voorvertoning: hoeveel mails per map, hoeveel MB totaal, welke mappen niet bestaan op kant 2, etc. Altijd je eerste run:

imapsync --dry \
  --host1 ... --user1 ... --password1 ... \
  --host2 ... --user2 ... --password2 ...

--usecache — tweede run is veel sneller

IMAPsync schrijft een lokale cache met al gemigreerde Message-IDs. Een tweede run met --usecache slaat al gekopieerde mails meteen over zonder ze opnieuw te checken op de server. Cruciaal bij grote mailboxen waar je meerdere runs doet (bijv. een eerste run vooraf, een tweede final-sync na DNS-cutover).

--automap — verschillende map-namen automatisch koppelen

Microsoft 365 noemt de Verzonden-map "Sent Items"; Gmail noemt het "[Gmail]/Sent Mail"; Hostnet noemt het simpelweg "Sent". Met --automap probeert IMAPsync deze gangbare verschillen automatisch te matchen, zodat je verzonden-mails niet plotseling in een aparte "Sent Items"-map verdwijnen.

--regextrans2 — map-namen handmatig hertypen

Voor gevallen die --automap niet aankan. Bijvoorbeeld: bron heeft een map "Verstuurd", doel verwacht "Sent":

--regextrans2 's/^Verstuurd$/Sent/'

Of om alle Gmail-prefix te strippen:

--regextrans2 's,\\[Gmail\\]/,,'

--nosyncacls — geen ACL-flags meekopiëren

Sommige IMAP-servers (Microsoft 365 in het bijzonder) geven errors bij het kopiëren van Access Control List flags. --nosyncacls voorkomt die errors zonder dat de mails zelf eronder lijden.

Voorbeeld 1: Hostnet → Microsoft 365

Een veel-gevraagd scenario. Hostnet IMAP heeft als host imap.hostnet.nl, Microsoft 365 gebruikt outlook.office365.com. Voor M365 heb je een app-wachtwoord nodig (niet je gewone account-wachtwoord, en 2FA moet aan staan op het account):

imapsync \
  --host1 imap.hostnet.nl --port1 993 --ssl1 \
  --user1 info@klant.nl --password1file ./oudpw.txt \
  --host2 outlook.office365.com --port2 993 --ssl2 \
  --user2 info@klant.nl --password2file ./365pw.txt \
  --authmech2 LOGIN \
  --automap \
  --nosyncacls \
  --usecache

Belangrijke punten in dit commando:

  • --authmech2 LOGIN — expliciet de auth-methode voor M365
  • --ssl1 en --ssl2 — SSL/TLS afdwingen voor beide kanten (verplicht bij M365)
  • --password1file — wachtwoord uit een file lezen, niet in shell-history
  • --nosyncacls — voorkomt M365-specifieke ACL-errors

Voorbeeld 2: Gmail / Google Workspace → eigen IMAP

Voor Gmail moet je in je Google-account 2FA aan hebben staan en een App Password aanmaken (Google Account → Security → App Passwords). Dat 16-cijferige wachtwoord gebruik je in plaats van je gewone Gmail-wachtwoord:

imapsync \
  --host1 imap.gmail.com --port1 993 --ssl1 \
  --user1 mijnaccount@gmail.com --password1 'xxxx xxxx xxxx xxxx' \
  --host2 mail.eigen-server.nl --port2 993 --ssl2 \
  --user2 info@example.com --password2file ./eigenpw.txt \
  --regextrans2 's,\\[Gmail\\]/,,' \
  --automap \
  --usecache

De --regextrans2 hier strooit de "[Gmail]/"-prefix uit Gmail's speciale mapnamen, zodat ze in je eigen IMAP gewoon onder normale mapnamen terechtkomen.

Voorbeeld 3: simpele provider-naar-provider migratie

Het meest voorkomende geval: oude Nederlandse hoster naar nieuwe Nederlandse hoster. Bijvoorbeeld TransIP naar Antagonist:

imapsync \
  --host1 mailcluster.transip.email --port1 993 --ssl1 \
  --user1 info@example.com --password1file ./transip.txt \
  --host2 imap.antagonist.nl --port2 993 --ssl2 \
  --user2 info@example.com --password2file ./antagonist.txt \
  --automap \
  --usecache

Vrijwel altijd voldoende. Beide partijen praten gewoon IMAPS, geen exotische auth-mechanismen, mappen worden automatisch gematcht.

Veelvoorkomende problemen en hoe ik ze fix

"Connection refused" of "Could not connect"

Bijna altijd een verkeerde host of port. Test eerst handmatig met openssl s_client:

openssl s_client -connect imap.hostnet.nl:993

Als die wel verbindt, klopt de host. Als niet: hostname klopt niet of je firewall/ISP blokkeert poort 993.

"Authentication failed"

Drie hoofdoorzaken:

  • Verkeerd wachtwoord — check ook of je copy-paste een trailing space heeft meegenomen
  • 2FA aan zonder app-wachtwoord — bij M365 en Gmail moet je een app-specifiek wachtwoord gebruiken
  • IMAP staat uit — sommige providers (Gmail, sommige hosters) hebben IMAP standaard uit en moet je activeren in je instellingen

Mails worden gekopieerd maar in een vreemde map

Map-namen verschillen tussen providers. Voorbeeld: bron heeft "Verzonden", doel verwacht "Sent". Gebruik --automap als eerste poging; als dat niet helpt, expliciet hertypen met --regextrans2:

--regextrans2 's/^Verzonden$/Sent/' \
--regextrans2 's/^Concepten$/Drafts/' \
--regextrans2 's/^Verwijderd$/Trash/'

"BAD Command rejected" / "OVER QUOTA"

Doel-mailbox is vol. Gebeurt vaak bij overstap naar een gratis-tier-pakket. Oplossing: ofwel doel-mailbox vergroten, ofwel met --minage en --maxage alleen recente mails kopiëren in plaats van het hele archief.

Server gooit verbinding eruit halverwege

Sommige IMAP-servers (vooral budget-hosters) hebben rate-limits of een max-aantal-actions-per-sessie. IMAPsync hervat met --usecache automatisch waar 't was gebleven. Op zware migraties: voeg --maxsleep toe om kunstmatig pauzes in te bouwen tussen batches.

Migratie duurt extreem lang

Drie versnellingen die ik vaak inzet:

  • --useheader Message-Id — sneller duplicate-detection door alleen Message-ID te vergelijken in plaats van een hash van de hele body
  • --noresyncflags — sla het opnieuw syncen van read/unread-flags over voor reeds gekopieerde mails
  • Parallel — voor meerdere mailboxes in één migratie: draai meerdere imapsync-processen tegelijk via een for-loop of GNU parallel. Drie tot vijf parallel werkt meestal goed; meer kan rate-limits triggeren

Veiligheidsoverwegingen

  • Wachtwoorden niet in shell-history: gebruik --password1file en --password2file met een file met chmod 600. Of zet ze in environment-variabelen die je niet per ongeluk historicizeert.
  • Logs bevatten metadata: IMAPsync schrijft uitgebreide logs met onder andere mail-subjects. Schoon ze op na de migratie of geef ze een chmod 600.
  • Cache-bestand bewaart Message-IDs: handig voor hervatting, maar verwijder 'm als de migratie klaar is en je geen gevoelige sporen wilt achterlaten.
  • Wachtwoord-rotatie achteraf: bij klant-migraties altijd, altijd, altijd het tijdelijk gedeelde wachtwoord laten wijzigen na afronding. Of nog beter: gebruik tijdens de migratie een tijdelijke app-password die je daarna intrekt.

Een typische migratie-flow van mij

Voor een complete klant-migratie loopt het proces meestal zo:

  1. Pre-flight check: --dry run om te zien hoeveel mails, mappen en GB er gemigreerd moeten worden. Zo weet ik vooraf de doorlooptijd.
  2. Pre-cutover sync: een paar dagen voor de DNS-overschakeling alvast een eerste sync starten met --usecache. Bij grote archieven kan dit 6-10 uur duren.
  3. DNS-cutover: MX-record omzetten naar nieuwe omgeving. Vanaf nu komen nieuwe mails op de nieuwe server binnen.
  4. Final sync: na de cutover een tweede imapsync-run. Dankzij --usecache is dit meestal een kwestie van 5-15 minuten — alleen recente mails worden gekopieerd.
  5. Spot-check: random checken: zelfde mappenstructuur? Mail uit 2014 op datum 2014? Verzonden-map vol? Pas daarna meld ik klaar.
  6. Oude mailbox laten staan: 30 dagen rollback-veiligheid. Daarna pas wegmigreren of opzeggen.

Beperkingen waar IMAPsync je niet bij helpt

  • Agenda en contactpersonen: IMAPsync doet alleen mail. Voor agenda's heb je CalDAV-tools nodig (calsync); voor contactpersonen CardDAV (carddav-sync of vdirsyncer)
  • Mailbox-instellingen: filters, regels, signatures, out-of-office-meldingen worden niet gekopieerd. Die moet je per mailbox-platform opnieuw inrichten
  • Shared mailboxes / public folders: technisch wel, maar vereist specifieke setup. M365 shared mailboxes kun je vaak beter migreren via de native Microsoft Migration Manager
  • Deleted-items-recovery: prullenbak wordt mee gemigreerd, maar 'deleted but recoverable'-items in M365 (de "Items recovery"-laag) niet

Wanneer outsource je dit

IMAPsync is op zichzelf niet ingewikkeld — in 80% van de gevallen draait het basis-commando uit de box. Maar:

  • Bij 50+ mailboxes wordt het beheer van credentials, parallel-runs, en monitoring per mailbox een operationele klus
  • Bij strakke deadlines (provider stopt morgen) wil je niet zelf debuggen op een onbekende foutmelding
  • Bij mixed sources (sommigen op M365, sommigen op IMAP, sommigen op Exchange-on-prem) loopt het script-werk snel uit
  • Bij compliance-eisen (zorg, accountancy) wil je een gedocumenteerde paper-trail die laat zien dat de migratie zorgvuldig is gegaan

Voor dit soort scenario's heb ik een vaste prijs van €14,95 per mailbox — zie de e-mail migratie-pagina voor de complete uitleg. Daarin zit het complete IMAPsync-werk plus DNS-cutover, communicatie naar gebruikers en 30-dagen-rollback.

Voor één of twee mailboxes en je hebt zelf een uurtje: deze handleiding moet je verder kunnen helpen. Als je vastloopt op een specifieke foutmelding: stuur me 'm, ik heb ze allemaal al een keer gezien.