摘要
今天我們使用tomav/docker-mailserver所提供的Docker Image來快速的架設一個簡單的Mail Server。
基礎知識
常見的郵局埠與通訊協議
發郵件的協議有SMTP,收郵件的協議有POP3和IMAP。
- SMTP:明文使用25埠。加密後使用25/587/465埠。
 
- IMAP:明文使用143埠。加密後使用143/993埠。
 
- POP3:明文使用110埠。加密後使用110/995埠。
 
這次使用的Docker映像檔為:tvial/docker-mailserver
確保您有安裝Docker、Docker-Compose 1.7 or higher
本服務所使用的連接埠:
Exposed ports
- 25 receiving email from other mailservers
 
- 465 SSL Client email submission
 
- 587 TLS Client email submission
 
- 143 StartTLS IMAP client
 
- 993 TLS/SSL IMAP client
 
- 110 POP3 client
 
- 995 TLS/SSL POP3 client
 
1
   | Note: Port 25 is only for receiving email from other mailservers and not for submitting email. You need to use port 465 or 587 for this.
   | 
 
Usage
- 從Docker Hub pull 映像檔
 
1
   | $ docker pull tvial/docker-mailserver:latest
   | 
 
- *Get tools, docker-compose.yml, the .env and the setup.sh files: *
 
1 2 3 4 5 6 7
   | $ curl -o setup.sh https://raw.githubusercontent.com/tomav/docker-mailserver/master/setup.sh
  $ chmod a+x ./setup.sh
  $ curl -o docker-compose.yml https://raw.githubusercontent.com/tomav/docker-mailserver/master/docker-compose.yml.dist
  $ curl -o .env https://raw.githubusercontent.com/tomav/docker-mailserver/master/.env.dist
   | 
 
Note:在這裡我找到一個問題,docker-compose.yml 檔案中第20行引入了”env-mailserver”,但在作者的README.MD、參數說明文件中並未找到此檔案說明。
下載來的 docker-compose.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
   | version: '2' services:   mail:     image: tvial/docker-mailserver:latest     hostname: ${HOSTNAME}     domainname: ${DOMAINNAME}     container_name: ${CONTAINER_NAME}     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/     env_file:     - .env     - env-mailserver     cap_add:     - NET_ADMIN     - SYS_PTRACE     restart: always volumes:   maildata:     driver: local   mailstate:     driver: local   maillogs:     driver: local
   | 
 
修改後的 docker-compose.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
   | version: '2'
  services:   mail:     image: tvial/docker-mailserver:latest     hostname: mail     domainname: mail.nemu.edu.tw     container_name: mail     ports:       - "25:25"       - "143:143"       - "587:587"       - "993:993"     volumes:       - /home/mail:/var/mail       - /home/mail-state:/var/mail-state       - /root/config/:/tmp/docker-mailserver/       - /etc/letsencrypt:/etc/letsencrypt     environment:       - ENABLE_SPAMASSASSIN=0       - ENABLE_CLAMAV=0       - ENABLE_FAIL2BAN=1       - ONE_DIR=1       - DMS_DEBUG=0       - SSL_TYPE=letsencrypt     cap_add:       - NET_ADMIN
   | 
 
請注意修改後文件的6、7行,hostname+domainname=完整域名,另外,在本次修改的設定檔中,將兩個服務關閉了,分別是ENABLE_SPAMASSASSIN、ENABLE_CLAMAV,
Add mail server user accont
1 2 3 4 5 6 7
   | $ mkdir -p /root/config $ touch /root/config/postfix-accounts.cf $ docker run --rm \  -e MAIL_USER=apple@app.nemu.edu.tw \  -e MAIL_PASS=123456 \  -ti tvial/docker-mailserver:latest \  /bin/sh -c 'echo "$MAIL_USER|$(doveadm pw -s SHA512-CRYPT -u $MAIL_USER -p $MAIL_PASS)"' >> /root/config/postfix-accounts.cf
   | 
 
建立DKIM Key
1 2 3
   | $ docker run --rm \  -v "/root/config":/tmp/docker-mailserver \  -ti tvial/docker-mailserver:latest generate-dkim-config
   | 
 
執行完之後查看/root/config/opendkim/keys/mail.nemu.edu.tw/mail.txt的內容就是我們要設定的dns解析。我的內容是:
1 2 3
   | $ cat /root/config/opendkim/keys/mail.nemu.edu.tw/mail.txt mail._domainkey IN TXT ( "v=DKIM1; k=rsa; " "p=MIGfMA0GCSqGSIb3DPENNNNNNNNNNCBiQKBgQCy9JV3FnXjLjsRJs/N0fy1C233333IV7t3f7fWpv/lo4NsoPEtG693hTgApkhuLl9KeV233333DMTagtXN898lXenKFEIS4COi7X/RjbGuOoApg4qS23333333TfXsrjN3xVC78E9T/HrS6pJN5fX+1s+1s+1s+1s+1s+1sIDAQAB" ) ; ----- DKIM key mail for mail.nemu.edu.tw
   | 
 
因為是自己搭建的bind直接把這段複製到OS裡的hosts檔案內就行了,如下圖直接貼上儲存。
Ex. MacOS、Linux的檔案位置如下:
1 2 3 4
   |  /private/etc/hosts
  /etc/hosts
 
  | 
 

建立SSL
1 2
   | $ cd ~/mail/docker-mailserver/ $ ./setup.sh config ssl
   | 
 
啟動Docker容器
確認防火牆有開啟郵件伺服器所需的通訊埠號,在CentOS中使用firewalld作為預設防火牆。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
   |  $ firewall-cmd --list-all
 
  $ firewall-cmd --add-port=25/tcp --permanent $ firewall-cmd --add-port=143/tcp --permanent $ firewall-cmd --add-port=465/tcp --permanent $ firewall-cmd --add-port=587/tcp --permanent $ firewall-cmd --add-port=993/tcp --permanent
 
  $ firewall-cmd --reload
 
  $ systemctl stop firewall $ systemctl disable firewall
 
  | 
 
啟動Docker容器
1 2
   |  $ docker-compose up -d mail
 
  | 
 
or
1 2
   |  $ docker-compose up mail
 
  | 
 
測試SSL設定是否成功
1
   | $ docker exec mail openssl s_client -connect 0.0.0.0:587 -starttls smtp -CApath /etc/letsencrypt/
   | 
 
和
1
   | $ docker exec mail openssl s_client -connect 0.0.0.0:993 -starttls imap -CApath /etc/letsencrypt/
   | 
 
若能看到以下結果,代表成功了。
1
   | Verify return code: 0 (ok)
   | 
 
Client端連線設定
收信:
- Server domain name:mail.nemu.edu.tw
 
- Protocol:IMAP
 
- Port:993
 
- Use SSL:是
 
發信:
- Server domain name:mail.nemu.edu.tw
 
- Protocol:SMTP
 
- Port:587
 
- Use SSL:是
 
測試結果
