After setting up the new mail server, the mail from the old server has to be migrated to the new server. I’ve done this before, and I have been looking through my old posts, here and on the old blog (, but it seems I haven’t written about the procedure.

  • Configure the mailbox on the new server
  • Put the reception of the mailbox on the old server on hold.
  • Copy the maildir to the new server.
  • Update DNS
  • Configure a transport for the on the old server to the new server
  • Release the hold

How do we put a mailbox on hold?

In /etc/postfix/ add check_recipient_access hash:/etc/postfix/recipient_access to smtpd_recipient_restrictions

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_recipient_access mysql:/etc/postfix/, reject_unauth_destination, reject_unknown_recipient_domain, check_policy_service unix:private/policy-spf,check_policy_service inet:,  check_recipient_access hash:/etc/postfix/recipient_access

Create a file /etc/postfix/recipient_access. To put the email addres on hold, put    HOLD

in the file.
Then run postmap /etc/postfix/recipient_access and restart posfix.

When that is done, copy the Maildir to the new server. As my mailbox is carrying over a decade of email, migrated this way several times, this takes a while. Anyhow, in the mean time, update the DNS records, and add a transport to the old server for the domain. (Please note, if there are multiple mailboxes on the domain, do this procedure to all of them before proceeding to the next step)

We want to configure a transport from the old to the new server, since it can take a while for DNS to propagate, and mail might still be arriving at the old server.
As the old server is running ISPConfig, this step can be done within ISPConfig. Select Email from the top menu, then select Email Routing from the left menu.
Click Add new transport at the top. Enter the domain name we want to forward, select No MX lookup and enter the new server at Destination.

When this is done, we’re going to release the HOLD we put on the mailbox before. This will cause all mail that has arrived while we were busy copy the mailbox over to be delivered to the new server. To do this, we remove the HOLD line from /etc/postfix/recipient_access and run postmap again. Restart postfix and run

postsuper -H  ALL

to release the hold.

Now everything should be ready, the mail hosting for the domain has been migrated, while still being able to receive mail at the old server while the DNS is propagating.