From old mailboxes to new servers: mail
mccb reads PST and OST files, Exchange, Microsoft 365, Google Workspace, IMAP, JMAP, mbox, Maildir and more, and writes to IMAP, CalDAV, CardDAV, JMAP or Exchange. It is built for sysadmins and hosting providers who migrate batches of mailboxes.
- Precheck
- Calendar
- Contacts
- Verify
anna.pst- Mail60
- Appointments8
- Contacts12
IMAPmail.example.com
0 / 60
CalDAVmail.example.com
0 / 8
CardDAVmail.example.com
0 / 12
Connection cut
1IdleSendingUnknownLooking it upOn the server, skippedAbsent, sent againSame UID, overwritten2IdleSendingUnknownLooking it upOn the server, skippedAbsent, sent againSame UID, overwritten3IdleSendingUnknownLooking it upOn the server, skippedAbsent, sent againSame UID, overwritten4IdleSendingUnknownLooking it upOn the server, skippedAbsent, sent againSame UID, overwritten
Press Start, then cut the connection whenever you like.Precheck: IMAP, DAV and the quota.Mail goes first, newest first, over parallel connections.Appointments next, over CalDAV. Each one has a fixed UID.Contacts last, over CardDAV. Each one has a fixed UID.Verify: folder counts are compared, and a sample of messages is read back by hash.The connection is gone, and nobody knows if the items in flight arrived. mccb retries by itself first; this demo jumps straight to the resume.Resume: items already done are skipped. Each mail in flight is looked up on the server by its X-PST-Import-Id, and sent again only if absent.Done, with one report per mailbox. Press Replay to try again, and cut it somewhere else.
In production
More than 500 GB of mail already migrated without errors, with calendars and contacts.
How it works
One server, many mailboxes, one report each.
Add a server
Pick the provider, or any IMAP server: address and port are filled in, and it is checked when saved.
Create a migration
Where the mail comes from, a file or a live server, and the mailbox it goes to. Many at once: import a CSV.
Start it
The mailbox's panel says what is still missing, then starts it. Run a dry run first if you like.
Follow and read
Follow every mailbox live, and read one report per mailbox.
Limits
Read this before you migrate.
Validate a migration on a test mailbox before running it on production data.
- One administrator, one host
One shared password, no accounts or roles. SQLite on a local disk, no high availability.
- Exchange, Microsoft 365 and Google are untested on real servers
These connectors have been tested against simulated servers only. Try one mailbox with few items first.
- Microsoft 365 limits
Mail written through Graph gets the date of the import as its received date. Attendees are written as text by default, and archive mailboxes are not migrated.
- JMAP calendars are not implemented
Use CalDAV for the calendars of a JMAP provider.
- Encrypted PSTs are not handled
A PST whose content is encrypted or protected by a password gives errors or is marked invalid.
- Corrupted PSTs can crash libpff
Affected items are skipped and reported. Past a limit of crashes the job fails, and a badly damaged PST can be rejected.
- Plain HTTP
Port 22362 speaks plain HTTP. Put mccb behind a reverse proxy and do not expose the port directly.
- amd64 only
The published image is for
linux/amd64.
Get mccb running
Open http://<host>:22362 and sign in with the printed password. It is shown once. Details are in the docs.
$ mkdir mccb && cd mccb
$ curl -fsSLO https://raw.githubusercontent.com/selfhostr/mccb/main/docker-compose.yml
$ docker compose up -d
$ docker compose logs web | grep -A2 "Admin password"