You just finished setting up your MX server and everything works fine. And now you are wondering whether you need a secondary MX server for backups. Some would say that these days you actually don’t need a secondary MX server, because MTAs (mail transfer agent) queue mail if MX server is down. In addition a secondary MX server might be abused by spammers. But just for fun, let’s assume you want to have a backup MX server. And you are lucky enough to have a friend who also runs an MX server which he is willing to configure as your backup server.
Let’s say your mail server is
mail.me.com and your friend’s
which you both run postfix as MTA.
DNS MX records
First make sure that DNS records are correct. You both need to set up DNS records to have secondary MX records point to each other:
mail.me.com A 188.8.131.52 me.com MX 0 mail.me.com me.com MX 10 mail.friend.com
mail.friend.com A 184.108.40.206 friend.com MX 0 mail.friend.com friend.com MX 10 mail.me.com
Postfix relay and transport
Postfix allows to set up mail relaying. It can be used to relay friend’s emails if a request
mail.me.com server which would happen if
mail.friend.com is down. In that case
Postfix queues a message and retries to relay it later to
Just update postfix to allow mail relay to
friend.com with a proper transport (no MX lookup, see below).
Add following lines to
relay_domains = friend.com transport_maps = hash:/path/to/postfix/transport
Make sure that
friend.com is not listed in
You also need to overwrite default relay transport in
/path/to/postfix/transport to avoid DNS loops
(when primary MX server is not available and mail is relayed to a secondary MX which is the same host):
Brackets  disable MX DNS lookup hence the mail for
friend.com is relayed to A record of
In this set up if
mail.friend.com is down then a secondary MX server, which is
mail.me.com, would be used.
mailme.com would try to relay mail, but since the destination host is down it would queue it for later delivery.
By default, postfix keeps such mail for 5 days, but it can be increased using option
bounce_queue_lifetime = 10d.