MailMigrator copies a mailbox from one IMAP server to another, keeping every folder, date and read state exactly where it was, and never deleting from the source. The kind of job companies overpay for, done for the cost of a small server, or free on your own computer.
Apache-2.0 · Self hosted · PHP 8.5
Pay a provider to migrate a mailbox for you and it runs into the hundreds. MailMigrator does the same job on a small server you switch off when it is done, and it is free if you run it on your own computer.
The same 10,000 mails. A provider bills you by the mailbox. With MailMigrator the only cost is a small server, or nothing at all on your own machine.
There is no seat count and no licence for each inbox. The same small server, or your own computer, moves one mailbox or five hundred. Migrate a single account or a whole company and the cost does not change.
MailMigrator is not a forwarder and it never touches your source. It writes each message into the destination exactly as it was, keeps a ledger so it can always pick up where it stopped, and skips anything already there.
Every message is written with IMAP APPEND, preserving its original internal date. A mail that arrived two years ago still reads as two years old on the other side, so nothing shows up as freshly received.
Every message is recorded in a ledger before and after it is copied. If the connection drops, or a shared hosting cron tick runs out of time, the next run reads the ledger and continues from the last recorded position. It never starts over.
Before copying, it checks the destination by Message-ID, falling back to a SHA-256 content hash when a server strips that header. Anything already there is skipped, which makes it completely safe to run a second time.
The source mailbox is only ever read from and the destination is only ever appended to. Nothing is deleted on either side, at any point, so the original stays exactly as you left it.
Folders and labels, read and unread state, flags and stars, attachments and the exact folder layout all come across intact. Special folders are mapped intelligently, and both sides of the mapping are configurable.
Built for big mailboxes. Messages are streamed one at a time with batching and throttling, so a mailbox of two hundred thousand messages will not exhaust memory or trip a provider's rate limits.
The workflow is deliberately cautious. You prove it works on a handful of messages before you ever commit the whole mailbox, following four steps in order.
Each step is a real command. Nothing is written to the destination until you ask it to.
There is no special integration to wait for. If an email client can log in to the account, MailMigrator can move the mailbox.
The migration engine has no idea whether a person or a script is driving it. The same framework agnostic code powers a scriptable command line tool and a full multi user dashboard.
A scriptable CLI with clear flags for testing, dry runs, folder scoping and limits. Perfect for a one off move or a job you leave to a cron worker.
A multi user web app for running and watching migrations. A live job dashboard shows per message copy status and progress bars as work goes through.
The same framework agnostic engine runs under both.
Plain PHP on well chosen libraries, with no framework to learn and nothing exotic to provision. It runs on ordinary shared hosting with one cron job, no VPS or Docker required.
You may be holding other people's live email passwords, so MailMigrator is built to protect them. Credentials are encrypted, the source is never touched, and nothing is ever deleted on either side.
Stored credentials are encrypted with defuse/php-encryption. The key lives only in your environment file, never in the database.
Argon2id password hashing with a bcrypt fallback, CSRF protection on every form, and per user job isolation so people only ever see their own work.
Billing webhooks are signature verified before anything is trusted, and you serve over HTTPS with the environment file kept out of the web root.
The source is only ever read from and the destination only ever appended to. Nothing is deleted anywhere, on either side.
Leave the built in paywall off and everything stays free and unlimited. Switch it on and MailMigrator becomes something you sell: give each customer a free quota, then charge past it, in whichever way suits you. You host it, you set the prices, you keep the revenue.
Charge a single payment for permanent access. Simple to explain and simple to buy, ideal for a one off move.
Sell credit packs measured in mailboxes or emails, so a customer pays for exactly the volume they move, no more.
Charge a monthly subscription for ongoing access, the model that fits agencies migrating for clients month after month.
MailMigrator is free to run yourself. If you would prefer we move the mail without the fuss, that starts with a short call.