Migrating Email to Migadu with imapsync

I’ve been on a bundled hosting plan — domain, web, and email in one package — for years. It’s the classic convenience trap: easy to set up, expensive to maintain, and opaque about what you’re actually paying for. The migration path I settled on is Cloudflare for DNS and domain registration, Cloudflare Pages for static hosting, and Migadu for email. This post covers the email side specifically: why Migadu, how to migrate existing mail with imapsync, and how to prep DNS for cutover.

Why Migadu

Migadu is a small Swiss email hosting provider. Their pricing model is unusual: you pay per plan, not per mailbox or domain. The entry-level plan (€19/year at time of writing) covers unlimited domains and unlimited addresses. If you run multiple domains, maintain catch-all addresses, or use per-service email aliases, this is significantly cheaper than per-seat alternatives.

Strengths:

  • Flat-rate pricing regardless of domain or mailbox count
  • Catch-all support on all plans
  • Clean, functional webmail
  • Straightforward DNS setup documentation — they give you exact records to copy
  • IMAP/SMTP access included; works with any client
  • Honest about what they are; no VC-backed growth theatre

Limitations worth knowing:

  • Outbound send limits on the cheapest plan (20/day on Micro). Fine for personal use; a problem if you’re sending automated mail or newsletters
  • Inbound limits too (200/day on Micro) — again, fine for personal, check if you’re expecting volume
  • Small team, not a hyperscaler - but I’m not expecting Awesome Support and all the nines.

For a personal domain with catch-all and low send volume, Migadu feels like a no-brainer. A long time ago I might have been woried about the send/receive limit, but email? Now, in 2026?

Migrating Existing Mail with imapsync

The standard pattern for moving email between providers is IMAP-to-IMAP sync. imapsync handles this cleanly: it copies folders, preserves flags (read/unread, starred), and is idempotent — you can run it multiple times and it won’t duplicate messages.

Before you run it

  • Empty your Trash and Spam folders at the source. imapsync copies everything it finds, including folders you don’t want. First time round I realised I still had some 8000 messages in Trash. Nope.
  • Get the IMAP settings.
  • Set up your Migadu account and create your mailboxes before running the migration. You need valid credentials on both ends.

Running imapsync via Docker

The easiest way to run imapsync without installing it natively is the official Docker image:

docker run --rm gilleslamiral/imapsync imapsync \
  --host1 imap.your-old-provider.com \
  --user1 [email protected] \
  --password1 'source-password' \
  --host2 imap.migadu.com \
  --user2 [email protected] \
  --password2 'migadu-password' \
  --ssl1 --ssl2

Key flags worth knowing:

  • --dry — runs without copying anything; use this first to verify connectivity and see what would be transferred
  • --folder INBOX — migrate a single folder rather than everything
  • --exclude Trash — skip specific folders by name
  • --automap — attempts to map folder names between providers automatically (useful if folder naming conventions differ)

Didn’t take that long for the 600 or so mesages I had.

Run it twice

It’s idempotent, so you can just keep running it. Certainly needs to be done (yet again) right before cutover.

Preparing for DNS Cutover

Not here yet - I still need to track down just how to get my domain out from one.com. They unhelpfully say “email our servicedesk from the registered email address” and provide a link to a web form.