14

I am setting up a testing server for a web based application that sends some email notifications.

Sometimes testing is performed with real customer data, and for that reason I need to guarantee that the server is not able to send emails to our real customers while we're testing.

What I want is to configure postfix so that it takes any outgoing email and redirects it to a single email address, instead of delivering to the real destination.

I am running Ubuntu server 9.10.

Thank you in advance

0x6A75616E
  • 661
  • 3
  • 10
  • 24

3 Answers3

21

Set up a local user to receive all trapped mail:

adduser mailtrap

You need to add in main.cf:

transport_maps = hash:/etc/postfix/transport
luser_relay = mailtrap

Then create /etc/postfix/transport with this in there:

localhost :
your.hostname.example.com:
* local:mailtrap

Save an then run: postmap /etc/postfix/transport finally restart postfix invoke-rc.d postfix restart

All local email will be delivered normally and external email will be delivered to the local mailtrap account.

Andrew Schulman
  • 8,561
  • 21
  • 31
  • 47
  • This is exactly what I was looking for... thank you! – 0x6A75616E Feb 12 '10 at 23:29
  • 3
    Works for me but only after I added `luser_relay = xxxxx` in `main.cf`. Without this the emails would bounce. – Alex R May 29 '11 at 00:57
  • 1
    When using Ubuntu, you can also restart Postfix with `sudo service postfix restart`. The location of your main.cf file mentioned above is `/etc/postfix/main.cf`. When first installing and setting up Postfix, you can use the `Local only` installation option. – Mark Northrop May 25 '12 at 09:12
  • on MAC you should run `postmap hash:/etc/postfix/transport` and `sudo postfix stop`, `sudo postfix start` – Bang Dao Jul 23 '13 at 08:50
  • this is great. does anyone know how to eliminate duplicates when a message has multiple recipients? – graywh Mar 21 '18 at 18:33
10

Better is to create a virtual alias file:

In /etc/postfix/main.cf:

virtual_alias_maps = pcre:/etc/postfix/virtual

In /etc/postfix/virtual:

/.*@.*/ root

You can replace root with whichever user you'd like to receive all the outgoing e-mail. This pattern can be tweaked if you want local mail to be delivered normally (without redirection):

/.*@(?!hostname\.localdomain$).*/ root

Original idea found here: Postfix development server - intercept all outgoing mail

5

Postfix provides something called smtp-sink. By default it blackholes all of the email it receives. Later versions can also be configured to capture the email in files.

This doesn't technically use postfix (but a utility provided by postfix.) It also doesn't technically redirect each email to a single email address. But it does capture all traffic on port 25 and dumps that to a file that can be parsed.

toppledwagon
  • 4,215
  • 24
  • 15
  • How does one invoke smtp-sink? The one manpage I found online made it look like it's a normal program, but if it came with postfix it's not installed on my system (OSX 10.6). How would I run this a service? – Chris Bloom Nov 22 '10 at 01:26
  • There is a manpage for smtp-sink. But some parameters are described here, too: http://blog.malowa.de/2011/04/postfix-as-spam-trap-server.html – mailq Aug 16 '11 at 09:30