Need help with docker-mailserver?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

docker-mailserver
7.1K Stars 1.1K Forks MIT License 1.7K Commits 22 Opened issues

Description

A fullstack but simple mail server (SMTP, IMAP, LDAP, Antispam, Antivirus, etc.) using Docker.

Services available

!
?

Need anything else?

Contributors list

Docker Mailserver

ci::status docker::pulls documentation::badge

A fullstack but simple mail server (SMTP, IMAP, LDAP, Antispam, Antivirus, etc.). Only configuration files, no SQL database. Keep it simple and versioned. Easy to deploy and upgrade. Documentation via MkDocs. Why this image was created..

If you have issues, read the full

README
and the documentation for your version (default is
edge
) first before opening an issue. The issue tracker is for issues, not for personal support.
  1. Included Services
  2. Issues and Contributing
  3. Requirements
  4. Usage
  5. Examples
  6. Environment Variables
  7. Documentation
  8. Release Notes

Included Services

Requirements

Recommended:

  • 1 Core
  • 2GB RAM
  • Swap enabled for the container

Minimum:

  • 1 vCore
  • 512MB RAM

Note: You'll need to deactivate some services like ClamAV to be able to run on a host with 512MB of RAM. Even with 1G RAM you may run into problems without swap, see FAQ.

Usage

Available image sources / tags

CI/CD will automatically build, test and push new images to container registries. Currently, the following registries are supported:

All workflows are using the tagging convention listed below. It is subsequently applied to all images pushed to supported container registries:

| Event | Ref | Commit SHA | Image Tags | |--------------|-----------------------|------------|-------------------------------| |

push
|
refs/heads/master
|
cf20257
|
edge
| |
push
|
refs/heads/stable
|
cf20257
|
stable
| |
push tag
|
refs/tags/[v]1.2.3
|
ad132f5
|
1.2.3
,
1.2
,
1
,
latest
|

Get the tools

Download

docker-compose.yml
and
mailserver.env
wget https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/docker-compose.yml
wget https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/mailserver.env

and the

setup.sh
in the correct version
# if you're using :edge as the image tag
wget https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/setup.sh
# if you're using :latest (= :9.1.0) as the image tag
wget https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/v9.1.0/setup.sh

chmod a+x ./setup.sh

and make yourself familiar with the script

./setup.sh help

Make sure to get the

setup.sh
that comes with the release you're using. Look up the release and the git commit on which this release is based upon by selecting the appropriate tag on GitHub. This can done with the "Switch branches/tags" button on GitHub, choosing the right tag. This is done in order to rule out possible inconsistencies between versions.

Create a docker-compose environment

  1. Install the latest docker-compose
  2. Edit
    docker-compose.yml
    to your liking
    • substitute
       and 
       according to your domain
    • if you want to use SELinux for the
      ./config/:/tmp/docker-mailserver/
      mount, append
      -z
      or
      -Z
  3. Configure the mailserver container to your liking by editing
    mailserver.env
    (Documentation)
    • this file supports only simple
      VAR=VAL
      (don't quote your values)
    • variable substitution is not supported (e.g. :noentrysign:
      OVERRIDE_HOSTNAME=$HOSTNAME.$DOMAINNAME
      :noentrysign:)

Get up and running

docker-compose up -d mailserver

for SELinux, use -Z

./setup.sh [-Z] email add [] ./setup.sh [-Z] alias add [email protected] ./setup.sh [-Z] config dkim

If you're seeing error messages about unchecked error, please verify that you're using the right version of

setup.sh
. Refer to the Get the tools section and / or execute

./setup.sh help
and read the
VERSION
section.

In case you're using LDAP, the setup looks a bit different as you do not add user accounts directly. Postfix doesn't know your domain(s) and you need to provide it when configuring DKIM:

./setup.sh config dkim domain '[,]'

If you want to see detailed usage information, run

./setup.sh config dkim help
.

Miscellaneous

DNS - DKIM

When keys are generated, you can configure your DNS server by just pasting the content of

config/opendkim/keys/domain.tld/mail.txt
to set up DKIM. See the documentation for more details.

Custom user changes & patches

If you'd like to change, patch or alter files or behavior of

docker-mailserver
, you can use a script. See the documentation for a detailed explanation.

Updating
docker-mailserver

docker-compose pull
docker-compose down
docker-compose up -d mailserver

You're done! And don't forget to have a look at the remaining functions of the

setup.sh
script with
./setup.sh help
.

Supported Operating Systems

We are currently providing support for Linux. Windows is not supported and is known to cause problems. Similarly, macOS is not officially supported - but you may get it to work there. In the end, Linux should be your preferred operating system for this image, especially when using this mailserver in production.

Bare Domains

If you want to use a bare domain (

hostname
==
domainname
), see FAQ.

Support for Multiple Domains

docker-mailserver
supports multiple domains out of the box, so you can do this:
./setup.sh email add [email protected]
./setup.sh email add [email protected]
./setup.sh email add [email protected]

SPF/Forwarding Problems

If you got any problems with SPF and/or forwarding mails, give SRS a try. You enable SRS by setting

ENABLE_SRS=1
. See the variable description for further information.

Ports

See the documentation for further details and best practice advice, especially regarding security concerns.

Examples

With Relevant Environmental Variables

This example provides you only with a basic example of what a minimal setup could look like. We strongly recommend that you go through the configuration file yourself and adjust everything to your needs. The default docker-compose.yml can be used for the purpose out-of-the-box, see the usage section.

version: '3.8'

services: mailserver: image: docker.io/mailserver/docker-mailserver:latest hostname: mail domainname: example.com container_name: mailserver ports: - "25:25" - "143:143" - "587:587" - "993:993" volumes: - maildata:/var/mail - mailstate:/var/mail-state - maillogs:/var/log/mail - ./config/:/tmp/docker-mailserver/ environment: - ENABLE_SPAMASSASSIN=1 - SPAMASSASSIN_SPAM_TO_INBOX=1 - ENABLE_CLAMAV=1 - ENABLE_FAIL2BAN=1 - ENABLE_POSTGREY=1 - ENABLE_SASLAUTHD=0 - ONE_DIR=1 - DMS_DEBUG=0 cap_add: - NET_ADMIN - SYS_PTRACE restart: always

volumes: maildata: mailstate: maillogs:

LDAP setup

version: '3.8'

services: mailserver: image: docker.io/mailserver/docker-mailserver:latest hostname: mail domainname: example.com container_name: mailserver ports: - "25:25" - "143:143" - "587:587" - "993:993" volumes: - maildata:/var/mail - mailstate:/var/mail-state - maillogs:/var/log/mail - ./config/:/tmp/docker-mailserver/ environment: - ENABLE_SPAMASSASSIN=1 - SPAMASSASSIN_SPAM_TO_INBOX=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)(objectClass=PostfixBookMailForward))(&(mailAlias=%s)(objectClass=PostfixBookMailAccount)(mailEnabled=TRUE))) - LDAP_QUERY_FILTER_DOMAIN=(|(&(mail=@%s)(objectClass=PostfixBookMailAccount)(mailEnabled=TRUE))(&(mailGroupMember=@%s)(objectClass=PostfixBookMailAccount)(mailEnabled=TRUE))(&(mailalias=*@%s)(objectClass=PostfixBookMailForward))) - 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 - SASLAUTHD_LDAP_FILTER=(&(objectClass=PostfixBookMailAccount)(uniqueIdentifier=%U)) - [email protected] - POSTFIX_MESSAGE_SIZE_LIMIT=100000000 cap_add: - NET_ADMIN - SYS_PTRACE restart: always

volumes: maildata: mailstate: maillogs:

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.