redirect all outgoing email to a single account with postfix

January 28, 2009

Lab environments can get fairly messy if not maintained and the gentle hand of a sysadmin is routinely applied. Security compliance is generally the last thing on a developers mind whilst hacking away at projects still in the development stage. Having lab databases filled with unobfuscated customer data which is never a good idea, is unfortunately common.

Im not condoning having real customer data in a lab environment, though it does happen and there is a real potential for a disaster to occur such as testing out your latest ‘mass email 2.0′ code on your lab database not realising that your lab data is actually a production data set. Oh yer, you also forgot to firewall outbound port 25/tcp aswell as well as having recursion available within your internal BIND9 view. Doh!@#

Heck, having your lab have any access to the intertubes is just a plain bad idea.. period.

Again, im not condoning this though you may want to catch all outgoing emails and redirect them to a single email account which can be viewed by fellow engineers and developers as a means of testing your features that can generate email.

Postfix can be setup to redirect all outgoing email to a single account. As long as your code hands email off to your MTA, this hack will do what you need. Your main.cf will need to look a bit like this.

relayhost = 223.1.2.1
bounce_queue_lifetime = 0
maximal_queue_lifetime = 0
always_bcc = rene@localhost

relayhost lets postfix know what is the next host to relay outgoing email through. For this hack, set relayhost to a bogus address. Setting this to a bogus IP address will force postfix to keep the email in its delivery queue without it actually reaching its next hop.

bounce_queue_lifetime defines the amount of time a bounce message is queued before it is considered undeliverable. Postfix will only attempt to deliver the bounce message once if bounce_queue_lifetime is set to 0.

maximal_queue_lifetime is the maximal time a message is queued before it is sent back as undeliverable. Again, 0 forces postfix to only attempt once.

Finally, always_bcc is the email account that will catch all mail. This account will also catch Non-Delivery Notifcation’s which may become annoying though a little procmail fu will fix that.

  • http://taz.net.au/blog/ Craig

    actually, a much better way to do this is with a transport table. it does what you want without filling your outbound queue or requiring CPU time to process all the bounces.

    1. add “transport_maps = hash:/etc/postfix/transport” to /etc/postfix/main.cf if it isn’t already there.

    2. edit /etc/postfix/transport and add:

    your.domain : .your.domain : * :discard

    (note that the first two entires have a null transport, after the “:”. that means “don’t change them, deliver as normal”)

    1. run “postmap transport”

    2. if you want to keep a copy of the sent mail, then also add the always_bcc rule to main.cf

    3. run “/etc/init.d/postfix restart”

    see the man pages for transport(5), discard(8), and access(5) for more info.

  • Mike

    I think there’s a typo in step 2. Shouldn’t the colon be after the transport, so the last line would be: * discard:

  • Heik

    top – exactly, what i was searching for my local dev machine ;)

  • http://twitter.com/ReneCunningham Rene Cunningham

    Awesome, glad I could help. 

Previous post:

Next post: