Temporary trashmail addresses with postfix
Warning: The information given in this article is outdated. See the project's website for up-to-date information.
If you are in need of temporary mail addresses (trashmail addresses) in postfix to avoid spam in your inbox you might be interested in the solution I found for this problem.
The idea is to generate an e-mail address from a date and a secret. Everyone who knows the secret (you and your mail server) will be able to generate the e-mail address for a given date. This e-mail address can then be used to sign up for a service or generated dynamically and published on your website and will only be valid for the current day.
Here is an example PHP code
$secret = "<Your secret>"; echo substr(md5(date("Ymd").$secret),0,8).'@example.com';
This will print a different e-mail address like
firstname.lastname@example.org for every day.
One problem with this technique is that if someone starts writing an e-mail at 23:59, he likely won't be finished before the address he uses expires. To solve this, two temporary addresses will always be valid: The one generated from the current date, and the one generated from yesterday's date.
To make this work with postfix, we need a way to map the temporary addresses to a permanent address. Looking at the Postfix Lookup Table Overview I decided to write a small script utilizing
socat (since the traditional
netcat package has its flaws and the OpenBSD version of
netcat did not perform very well) to implement a simple TCP/IP lookup table for postfix. This is probably not a solution for high frequented mail servers, but sufficient for personal use.
It's just about 40 lines of code to do the job, and can be found on GitHub. On Debian 8 you will need the
root@mailhost:~# apt-get install socat git root@mailhost:~# git clone https://github.com/68b32/postfix-trashmail.git
You have to open the actual script
postfix-trashmail to configure some parameters
SECRET="<Your secret>" LENGTH=8 DOMAIN="example.com" MAILDROP="email@example.com" INTERFACE="127.0.0.1" PORT="10000"
SECRET sets the secret as described above and will be used to generate the temporary e-mail addresses consisting out of
LENGTH hexadecimal characters followed by
DOMAIN. So the above configuration will generate e-mail addresses like
MAILDROP sets the address that is mapped to the temporary addresses. This is where mail sent to temporary addresses should be delivered to.
PORT set the IP address and the port for the TCP lookup table. If this script is run on the same machine as the postfix daemon, a local interface should be used.
To test the configuration, run the script without arguments first. This will print the currently valid temporary addresses.
root@mailhost:~/postfix-trashmail# ./postfix-trashmail firstname.lastname@example.org email@example.com
Now start the script in listen mode with
root@mailhost:~/postfix-trashmail# ./postfix-trashmail -l
and from another terminal use the
postmap command to query for the real address.
root@mailhost:~# postmap -q firstname.lastname@example.org tcp:127.0.0.1:10000 email@example.com
If you query for a currently valid temporary address, the permanent address as specified in
MAILDROP should be returned. Querying for any other address should return an empty result.
To install the script and start it automatically on boot before postfix, copy the script to some commonly used path and install the
systemd configuration. On Debian 8 you can do this with
root@mailhost:~# cp postfix-trashmail/postfix-trashmail /usr/local/bin root@mailhost:~# chown postfix:postfix /usr/local/bin/postfix-trashmail root@mailhost:~# chmod 700 /usr/local/bin/postfix-trashmail root@mailhost:~# cp postfix-trashmail/postfix-trashmail.service /etc/systemd/system root@mailhost:~# systemctl daemon-reload root@mailhost:~# systemctl start postfix-trashmail root@mailhost:~# systemctl enable postfix-trashmail Created symlink from /etc/systemd/system/postfix.service.wants/postfix-trashmail.service to /etc/systemd/system/postfix-trashmail.service.
Then edit your
/etc/postfix/main.cf to add the lookup table to the
virtual_alias_maps = ... tcp:127.0.0.1:10000
Reload postfix and test if you receive mails to the addresses printed by the
root@mailhost:~# postfix reload && postfix-trashmail firstname.lastname@example.org email@example.com