Simplest and Smallest Email Forward Service based on Docker.
View on Github - https://github.com/zixia/docker-simple-mail-forwarder
Voice from Users
@Brian Christner : After testing a ton of different mail projects I finally discovered Simple Mail Forwarder (SMF) by Zixia. This image is based on Alpine which is already a positive. It is super tiny and as the name suggests, easy to use. link
@kachkaev : really happy to discover it! link
@kiani: have a working mail server, seriously, it was that easy. link
@counterbeing : great image. Wonderfully easy interface, with all that i need.
@nelfer : Guess what? Your image already supports this! link
What is SMF? (Simple Mail Forwarder)
If you had a domain name and only wanted to have one(or a few) email address from this domain, but you want to forward all the emails to another email account. SMF is exactly what you need. (with Docker)
This docker image was built for ultimate simplicity because of this reason. I owned many domains and needed email addresses of them(for fun/work), and I hated to config email server. Some DNS providers provide free email forwarding service for their own domain, some do not. And almose all email forwarding service is NOT free. So I decided to make it myself(thanks docker).
- DuoCircle Email Forwarding From $59.95/year
- Cloud Mail In From $9/month. And it is not for human.
- MailGun professional service. Free plan includes 10,000 emails/month. but can result in your domain being treated as spam
I was willing to pay $10/year, but the cheapest plan I could find was $9 per month. Having a $10 USD machine with unlimited mail&domains per month is an amazing idea! And of course you could also put other dockers on this same machine. :-D
Quick Start (TL;DR)
SMF_CONFIG and run:
$ export SMF_CONFIGfirstname.lastname@example.org:email@example.com:test' $ docker run -e SMF_CONFIG="$SMF_CONFIG" -p 25:25 zixia/simple-mail-forwarder
Don't forget to modify the DNS MX record of your domain. (in this example, it's testo.com)
If you want to forward all emails sent to domain testo.com to firstname.lastname@example.org, set it like so:
$ export SMF_CONFIGemail@example.com:firstname.lastname@example.org'
See? There is nothing easier.
If you want to run it constanly in the background add
-t -d --restart=alwaysafter
$ docker run -t -d --restart=always -e SMF_CONFIG="$SMF_CONFIG" -p 25:25 zixia/simple-mail-forwarder
-t: Allocate a pseudo-tty
-d: Detached Mode
--restart=always: Restart this container automatically
Otherwise, docker thinks that your applications stops and shutdown the container.
How to run:
$ docker run zixia/simple-mail-forwarder test >> exec bats test 1..20 ok 1 confirm hostname pretend to work. ok 2 confirm hwclock pretend to work. ok 3 service postfix could start/stop right. ok 4 SMF_CONFIG exist ok 5 SMF_DOMAIN exist ok 6 virtual maping source is set ok 7 virtual maping data is set ok 8 virtual maping db is set ok 9 system hostname FQDN resolvable ok 10 postfix myhostname FQDN & resolvable ok 11 check other hostname setting ok 12 confirm postfix is running ok 13 confirm port 25 is open ok 14 crond is running ok 15 ESMTP STATTLS supported ok 16 ESMTP AUTH supported ok 17 ESMTP STARTTLS supported ok 18 create user email@example.com by password test ok 19 ESMTP AUTH by firstname.lastname@example.org/test ok 20 ESMTP TLS AUTH by email@example.com/test
You are all set! :-]
Environment Variable and Default Values
SMF_CONFIG: MUST be defined. no default setting. (set me! I'm the only parameter~)
Here's how to config the only environment parameter of SMF Docker:
$ export SMF_CONFIGfirstname.lastname@example.org:email@example.com'
Forward all emails received by any email address in domain testo.com to firstname.lastname@example.org:
$ export SMF_CONFIGemail@example.com:firstname.lastname@example.org'
You could get the ESMTP AUTH password for you on your docker log. It's randomly generated if you do not provide one.
Add ESMTP AUTH password:
$ export SMF_CONFIGemail@example.com:firstname.lastname@example.org:ThisIsPassword'
Password will be printed on the docker log.
Add as many email accounts as you want, with or without password. Seperated by semicolon or a new line:
$ export SMF_CONFIGemail@example.com:firstname.lastname@example.org:ThisIsPassword;email@example.com:firstname.lastname@example.org:AnotherPassword'
Tips: if you only provide the first password and leave the rest blank, then the passwords for all the rest accounts will be the same as the last password value you set. This is by design.
You can also forward all emails received by email@example.com to multiple destination addresses:
$ export SMF_CONFIGfirstname.lastname@example.org:email@example.comfirstname.lastname@example.orgemail@example.com'
Here's howto config a relayhost/smarthost to use for forwarding mail.
Send all outgoing mail trough a smarthost on 192.168.1.2
$ export SMF_RELAYHOST='192.168.1.2'
TLS (SSL) Certificates
SMF creates its own certificate and private key when starts. However, this certificate is self signed and so some systems might give you a warning about the server not being trusted. If you have valid certificates for the domain name of the host, then you can use them and avoid the warning about not being trusted.
First you need to prepare the certificate files. Copy your full chain certificate to a file named
smtp.cert. Then copy the private key to a file named
Copy these files to a folder. For example:
/data/certs/. This folder will be mounted as a volume in SMF
When creating the container, add the
-v(volume) parameter to mount it to the folder
$ docker run -e SMF_CONFIG="$SMF_CONFIG" -p 25:25 -v /data/certs/:/etc/postfix/cert/ zixia/simple-mail-forwarder
- Your emails should now be forwarded with trusted encryption. You can use this tool to test it: http://checktls.com/
If you do not have a certificate and don't have the $$ to buy one, you can use https://letsencrypt.org if you have shell access to the server (Notice, SMF does not provide, yet, this service). Letsencrypt allows you to create valid trusted certificates for a server, if the server responds to the domain you specify. In order to do this, you need to run the program from within the server and have administrator rights.
- First install letsencrypt. This might vary by distribution, but in Ubuntu it is like this:
$ sudo apt-get install letsencrypt
Stop any web server that might be using port 80 (Apache, nginx, etc)
Determine all of the domains and subdomains that you want the certificate to cover, for example
smtp.mydomain.com, etc. Remember to include the domain that SMF will respond to (as per MX record in DNS configuration of the domain)
Execute the following command (you can add as many domains as you wish with the
-doption. But remember, their DNS resolution must resolve to the server where
letsencryptis being executed)
$ letsencrypt certonly --standalone -d yourdomain.com -d www.yourdomain.com -d mail.yourdomain.com
Follow the prompts and if everything is successful you will get your certificates in a folder like
You can now use those certificates to make SMF TLS trusted.
This was a quick way of how to use letsencrypt. For a full tutorial based on your OS see: https://certbot.eff.org/
- Build from source.
$ ./script/build.sh latest
- Run a self-test for SMF docker.
$ ./script/run.sh latest test
- Get a shell inside SMF docker.
$ ./script/devshell.sh latest
$ telnet 127.0.0.1 25 > 220 testo.com ESMTP ehlo test.com > 250-testo.com > 250-STARTTLS > 250-AUTH PLAIN LOGIN auth plain > 334 dGVzdGlAdGVzdG8uY29tAHRlc3RpQHRlc3RvLmNvbQB0ZXN0 > 235 2.7.0 Authentication successful quit > 221 2.0.0 Bye > Connection closed by foreign host
P.S. The magic string
dGVzdGlAdGVzdG8uY29tAHRlc3RpQHRlc3RvLmNvbQB0ZXN0 stands for
firstname.lastname@example.org\email@example.com\0test in base64 encoding, required by AUTH PLAIN.
Useful article about SMTP Authentication: http://www.fehcom.de/qmail/smtpauth.html
Github Issue - https://github.com/zixia/docker-simple-mail-forwarder/issues
v1.0.0 (25 Jul 2017)
- Release v1.0
v0.4.3 (14 Jul 2017)
- Add a note about running it in the background to prevent docker auto shutdown. by @delmicio #27
- Added smarthost support by @Duumke #22
- Added support for mynetworks by @SamMousa #20
- Allow own certificates by @nelfer #15
- Updated documentation for forward all emails @nelfer #14
- ARM version of armhf by @dimitrovs #12
- use SMF_DOMAIN env for certificate's CN by @bcardiff #11
- allow multiple forwards separated by | by @kminek #7
- Update docker-compose.yml to fix tutum tag by @vegasbrianc #4
v0.4.2 (25 Sep 2016)
- close issue #1
- increace message size limit from 10MB to 40MB
- fix domain name in scripts
- fix unit test fail error: do not upgrade alpine
- restore deploy button in reamde: it is docker cloud now.(former tutum)
- switch FROM image from alpine to sillelien/base-alpine
- NOT to use OpenRC(very buggy run inside docker container) any more!
- better ESMTP TLS AUTH test script
- docker image size: 10MB
v0.3.0 <- Don't use me, I'm BUGGY
- CI(continuous integration) supported by use CircleCI
- CD(continuous delivery) supported by use Tutum Button
- write better tests
- tune OpenRC inside alpine linux
- full description README
- docker image size: 7MB
v0.2.0 <- Don't use me, I'm BUGGY
- supported specify user password
- supported ESMTP TLS
- docker image size: 7MB
- basic forward function
- docker image size: 6MB
A Cloud Service that could host docker is required.
A Docker management platform is recommanded.
Docker is required.
Copyright & License
- Code & Documentation 2015© zixia
- Code released under the Apache 2.0 license
- Docs released under Creative Commons