A fullstack but simple mail server (smtp, imap, antispam, antivirus...). Only configuration files, no SQL database. Keep it simple and versioned. Easy to deploy and upgrade.
Includes:
Why I created this image: Simple mail server with Docker
Before you open an issue, please have a look this README, the Wiki and Postfix/Dovecot documentation.
docker pull tvial/docker-mailserver:latest
docker-compose.ymlAdapt this file with your FQDN. Install docker-compose in the version 1.6 or higher.
Your configs must be mounted in /tmp/docker-mailserver/. To understand how things work on boot, please have a look to start-mailserver.sh
restart: always ensures that the mail server container (and ELK container when using the mail server together with ELK stack) is automatically restarted by Docker in cases like a Docker service or host restart or container exit.
version: '2'
services:
mail:
image: tvial/docker-mailserver:latest
hostname: mail
domainname: domain.com
container_name: mail
ports:
- "25:25"
- "143:143"
- "587:587"
- "993:993"
volumes:
- maildata:/var/mail
- mailstate:/var/mail-state
- ./config/:/tmp/docker-mailserver/
environment:
- ENABLE_SPAMASSASSIN=1
- ENABLE_CLAMAV=1
- ENABLE_FAIL2BAN=1
- ENABLE_POSTGREY=1
- ONE_DIR=1
- DMS_DEBUG=0
cap_add:
- NET_ADMIN
volumes:
maildata:
driver: local
mailstate:
driver: local
for ldap setup:
version: '2'
services:
mail:
image: tvial/docker-mailserver:latest
hostname: mail
domainname: domain.com
container_name: mail
ports:
- "25:25"
- "143:143"
- "587:587"
- "993:993"
volumes:
- maildata:/var/mail
- mailstate:/var/mail-state
- ./config/:/tmp/docker-mailserver/
environment:
- ENABLE_SPAMASSASSIN=1
- ENABLE_CLAMAV=1
- ENABLE_FAIL2BAN=1
- ENABLE_POSTGREY=1
- ONE_DIR=1
- DMS_DEBUG=0
- ENABLE_LDAP=1
- LDAP_SERVER_HOST=ldap # your ldap container/IP/ServerName
- LDAP_SEARCH_BASE=ou=people,dc=localhost,dc=localdomain
- LDAP_BIND_DN=cn=admin,dc=localhost,dc=localdomain
- LDAP_BIND_PW=admin
- LDAP_QUERY_FILTER_USER="(&(mail=%s)(mailEnabled=TRUE))"
- LDAP_QUERY_FILTER_GROUP="(&(mailGroupMember=%s)(mailEnabled=TRUE))"
- LDAP_QUERY_FILTER_ALIAS="(&(mailAlias=%s)(mailEnabled=TRUE))"
- DOVECOT_PASS_FILTER="(&(objectClass=PostfixBookMailAccount)(uniqueIdentifier=%n))"
- DOVECOT_USER_FILTER="(&(objectClass=PostfixBookMailAccount)(uniqueIdentifier=%n))"
- ENABLE_SASLAUTHD=1
- SASLAUTHD_MECHANISMS=ldap
- SASLAUTHD_LDAP_SERVER=ldap
- SASLAUTHD_LDAP_BIND_DN=cn=admin,dc=localhost,dc=localdomain
- SASLAUTHD_LDAP_PASSWORD=admin
- SASLAUTHD_LDAP_SEARCH_BASE=ou=people,dc=localhost,dc=localdomain
- [email protected]
cap_add:
- NET_ADMIN
volumes:
maildata:
driver: local
mailstate:
driver: local
Don't forget to adapt MAIL_USER and MAIL_PASS to your needs
mkdir -p config
touch config/postfix-accounts.cf
docker run --rm \
-e [email protected] \
-e MAIL_PASS=mypassword \
-ti tvial/docker-mailserver:latest \
/bin/sh -c 'echo "$MAIL_USER|$(doveadm pw -s SHA512-CRYPT -u $MAIL_USER -p $MAIL_PASS)"' >> config/postfix-accounts.cf
docker run --rm \
-v "$(pwd)/config":/tmp/docker-mailserver \
-ti tvial/docker-mailserver:latest generate-dkim-config
Now the keys are generated, you can configure your DNS server by just pasting the content of config/opendkim/keys/domain.tld/mail.txt in your domain.tld.hosts zone.
Note: you can also manage email accounts, DKIM keys and more with the setup.sh convenience script.
docker-compose up -d mail
You're done!
Please check how the container starts to understand what's expected. Also if an option doesn't work as documented here, check if you are running the latest image!
Value in bold is the default value.
Note: this spamassassin setting needs ENABLE_SPAMASSASSIN=1
Note: this spamassassin setting needs ENABLE_SPAMASSASSIN=1
Note: this spamassassin setting needs ENABLE_SPAMASSASSIN=1
Note: this spamassassin setting needs ENABLE_SPAMASSASSIN=1
/var/mail-state) to allow persistence using docker volumesIf you enable Fail2Ban, don't forget to add the following lines to your docker-compose.yml:
cap_add:
- NET_ADMIN
Otherwise, iptables won't be able to ban IPs.
fetchmail disabledfetchmail enabled"(&(mail=%s)(mailEnabled=TRUE))""(&(mailGroupMember=%s)(mailEnabled=TRUE))""(&(mailAlias=%s)(mailEnabled=TRUE))""(&(objectClass=PostfixBookMailAccount)(uniqueIdentifier=%n))""(&(objectClass=PostfixBookMailAccount)(uniqueIdentifier=%n))"hostname command to get the mail server's canonical hostnamepostgrey is disabledpostgrey is enabledNote: This postgrey setting needs ENABLE_POSTGREY=1
Note: This postgrey setting needs ENABLE_POSTGREY=1
Note: This postgrey setting needs ENABLE_POSTGREY=1
saslauthd is disabledsaslauthd is enabledldap => authenticate against ldap servershadow => authenticate against local user dbmysql => authenticate against mysql dbrimap => authenticate against imap serverldap:// will be usedldaps:// will be used(&(uniqueIdentifier=%u)(mailEnabled=TRUE))(&(sAMAccountName=%U)(objectClass=person))(&(uid=%U)(objectClass=person))/etc/postfix/sasl_passwd will be created with the string as passwordPlease read the SSL page in the wiki for more information.
Set different options for mynetworks option (can be overwrite in postfix-main.cf)
Set how many days a virusmail will stay on the server before being deleted
This Option is activating the Usage of POSTFIX_DAGENT to specify a ltmp client different from default dovecot socket.
Enabled by ENABLE_POSTFIX_VIRTUAL_TRANSPORT. Specify the final delivery of postfix
lmtp:unix:private/dovecot-lmtp (use socket)lmtps:inet:<host>:<port> (secure lmtp with starttls, take a look at https://sys4.de/en/blog/2014/11/17/sicheres-lmtp-mit-starttls-in-dovecot/)lmtp:<kopano-host>:2003 (use kopano as mailstore)Content type
Image
Digest
Size
322.6 MB
Last updated
about 9 years ago
docker pull rgv151/docker-mailserver