Skip to content

Host your own Email server

All steps run in Arch linux. The system should have installed 'docker and docker-compose.

1. Set DNS

I suppose the domain is mail.abc.com, and the IP is 1.2.3.4

------------------------------------------------------------------------------
    Type    Host                value
1   A       mail.abc.com        1.2.3.4
2   MX      root domain(@)      mail.abc.com
3   TXT     root domain(@)      v=spf1 ip4:1.2.3.4 -all
4   TXT     _dmarc              v=DMARC1; p=reject; adkim=r; aspf=r; pct=100
5   TXT     mail._domainkey     DKIM file
------------------------------------------------------------------------------

2. Downlaod and config

docker pull mailserver/docker-mailserver:latest

2.1 necessary files

DMS_GITHUB_URL="https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master"
wget "${DMS_GITHUB_URL}/compose.yaml"
wget "${DMS_GITHUB_URL}/mailserver.env"
The compose.yaml:
services:
  mailserver:
    image: ghcr.io/docker-mailserver/docker-mailserver:latest
    container_name: mailserver
    # Provide the FQDN of your mail server here (Your DNS MX record should point to this value)
    hostname: mail.abc.com
    env_file: mailserver.env
    # More information about the mail-server ports:
    # https://docker-mailserver.github.io/docker-mailserver/latest/config/security/understanding-the-ports/
    ports:
      - "25:25"    # SMTP  (explicit TLS => STARTTLS, Authentication is DISABLED => use port 465/587 instead)
      - "143:143"  # IMAP4 (explicit TLS => STARTTLS)
      - "465:465"  # ESMTP (implicit TLS)
      - "587:587"  # ESMTP (explicit TLS => STARTTLS)
      - "993:993"  # IMAP4 (implicit TLS)
    volumes:
      - ./docker-data/dms/mail-data/:/var/mail/
      - ./docker-data/dms/mail-state/:/var/mail-state/
      - ./docker-data/dms/mail-logs/:/var/log/mail/
      - ./docker-data/dms/config/:/tmp/docker-mailserver/
      - /etc/localtime:/etc/localtime:ro
        #- /etc/nginx/certificate/:/etc/letsencrypt
      - /etc/nginx/certificate/live/mail.abc.com/fullchain.pem:/etc/cert/fullchain.pem
      - /etc/nginx/certificate/live/mail.abc.com/privkey.pem:/etc/cert/privkey.pem
    restart: always
    stop_grace_period: 1m
    # Uncomment if using `ENABLE_FAIL2BAN=1`:
    cap_add:
      - NET_ADMIN
    healthcheck:
      test: "ss --listening --ipv4 --tcp | grep --silent ':smtp' || exit 1"
      timeout: 3s
      retries: 0

2.2 Set SSL

Host:

/etc/nginx/certificate/live/mail.abc.com/fullchain.pem
/etc/nginx/certificate/live/mail.abc.com/privkey.pem
Container:
/etc/cert/fullchain.pem
/etc/cert/privkey.pem

3. Start mail server

docker compsoe up -d
Create an email account
setup email add user@abc.com
Set DKIM
setup config dkim
Display mail.txt
cat /tmp/docker-mailserver/opendkim/keys/isec.dev/mail.txt
The complete DKIM
v=DKIM1; h=sha256; k=rsa; 
p=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxx

FAQ

Enable DKIM

1.Backup docker-date

tar -czvf docker-data.tar.gz docker-data
2.Delete docker-date and container
rm -rf docker-data
docker stop mailserver
docker rm mailserver
3.Start a new container
docker compose up -d
4.Delete docker-date
rm -rf docker-data
5.Uncompress docker-date.tar.gz
tar -xzvf docker-data.tar.gz
6.Restart the container
docker restart mailserver