何かしらサービスを申し込む際にはメールアドレスが必要になる。 Docker Mailserverを使って、Docker環境でさくっと立てる方法を書いていく。

今日日、どのISPでもクラウドでも、スパム対策でデフォルトでOutboundのport:25が開いていない。ので、何も考えずにサーバーを立てると、Emailの送信ができない。けど、受信だけできれば十分な場合が多いので問題ない。

送信できるEmail環境構築については、この記事で解説しています。

要件

基本的にdockerおよびdocker-composeの環境があればよい。

  • docker
  • docker-compose

0. 今回想定する環境設定の値

項目
メールサーバ OS Ubuntu Linux
メールサーバ Public IP 11.22.33.44
作業ディレクトリ /home/ubuntu/docker-mailserver
メールサーバのホスト名 mailserver.example.com
メールアドレスのドメイン @m.example.com
メールアドレス [email protected]

1. Linuxホストを用意する

PublicからアクセスできるLinuxマシンを用意する。ここではAWSのEC2にUbuntu環境を想定する。

  • LinuxホストのPublic IP: 11.22.33.44

2. LinuxホストのNWポートを開ける

以下のポートの受信を許可する。

  • Inbound port: 25, 80, 143, 587, 993

EC2の場合はセキュリティグループの設定をする。 port:80はSSL証明書(Let’s Encrypt)の取得・更新のために開けておく。

3. DNSレコードを追加

以下の2つのレコードをexample.comのゾーンに追加。

  • mailserver.example.com A 11.22.33.44
  • m.example.com mx 50

今回は、送信を想定しないので、SPF, DIKMレコードは省略 DNSレコードをミスるとキャッシュが切れるまで変更が効かないの、初めは短めのTTL(例えばTTL=60sec)で設定しておく。

登録後は念のため、DNSで引けるか確認しておく。

$ dig mailserver.example.com a +short
11.22.33.44

$ dig m.example.com mx +short
50 mailserver.example.com

しっかり正しく引けている。

4. SSL証明書の取得

Let’s Encryptのcert botでSSL証明書を取得する。 certbotもDockerで提供されているので、それを使う(もちろんローカルにインストールしても良い)。

$ mkdir docker-mailserver

$ cd docker-mailserver

$ docker run --rm -it \
  -v "${PWD}/docker-data/certbot/certs/:/etc/letsencrypt/" \
  -v "${PWD}/docker-data/certbot/logs/:/var/log/letsencrypt/" \
  -p 80:80 \
  certbot/certbot certonly --standalone -d mailserver.example.com
...
いくつか質問事項が聞かれる
...
Successfully received certificate.

### 発行された証明書のディレクトリの確認
$ ls docker-data/certbot/certs/
accounts  archive  csr  keys  live  renewal  renewal-hooks

5. Docker MailserverのScriptをダウンロード

### 作業ディレクトリにいることを確認
$ pwd
/home/ubuntu/docker-mailserver

$ DMS_GITHUB_URL='https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master'

$ wget "${DMS_GITHUB_URL}/docker-compose.yml"

$ wget "${DMS_GITHUB_URL}/mailserver.env"

$ wget "${DMS_GITHUB_URL}/setup.sh"

$ chmod a+x ./setup.sh

### 動作するか確認
$ ./setup.sh help

6. docker-compose.ymlを編集

services:
  mailserver:
    image: docker.io/mailserver/docker-mailserver:latest
    container_name: mailserver
    # If the FQDN for your mail-server is only two labels (eg: example.com),
    # you can assign this entirely to `hostname` and remove `domainname`.
    hostname: mailserver.example.com  #<== ここ編集!
    domainname: m.example.com  #<== ここ編集!
    env_file: mailserver.env
    # More information about the mail-server ports:
    # https://docker-mailserver.github.io/docker-mailserver/edge/config/security/understanding-the-ports/
    # To avoid conflicts with yaml base-60 float, DO NOT remove the quotation marks.
    ports:
      - "25:25"    # SMTP  (explicit TLS => STARTTLS)
      - "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
      - ./docker-data/certbot/certs/:/etc/letsencrypt # <==ここ追記!
    restart: always
    stop_grace_period: 1m
    cap_add:
      - NET_ADMIN
      - SYS_PTRACE

7. mailserver.envを編集

ファイルの中のSSL_TYPEletsencryptに設定する。

...
SSL_TYPE=letsencrypt
...

8. メールアドレスを設定する

$ ./setup.sh email add [email protected] 
##パスワード入力

9. mailserverを起動!

デバッグのため、最初はフォアグランドモード(-dオプションなし)で起動させる。あとで、問題なければ-dで再起動させる。

$ docker-compose up

10. メールクライアントから接続テスト

メールクライアントで以下を設定して、接続確認する。

設定項目
メールサーバ mailserver.example.com
ユーザー名 [email protected]
パスワード 上記で設定したパスワード

11. 問題なければデーモン化

先ほどdocker-compose up立ち上げたプロセスをCtrl-cで停止して、再度docker-compose up -dで立ち上げる。

....
Ctrl-c

$ docker-compose up -d

$ docker-compose ps

NAME                COMMAND                  SERVICE             STATUS              PORTS
mailserver          "/usr/bin/dumb-init …"   mailserver          running             0.0.0.0:25->25/tcp, 0.0.0.0:143->143/tcp, 0.0.0.0:465->465/tcp, 0.0.0.0:587->587/tcp, 0.0.0.0:993->993/tcp, :::25->25/tcp, :::143->143/tcp, :::465->465/tcp, :::587->587/tcp, :::993->993/tcp

12. certbotをcrontabに登録

Let’s EncryptのDV証明書は有効期限が90日なので、更新用のスクリプトをcronで回しておく。 作業ディレクトリ内にcert_renew.shを作成し、以下を書き込む。

$ pwd
/home/ubuntu/docker-mailserver

$ vim cert_renew.sh
---
#!/bin/bash
docker run --rm  \
  -v "${PWD}/docker-data/certbot/certs/:/etc/letsencrypt/" \
  -v "${PWD}/docker-data/certbot/logs/:/var/log/letsencrypt/" \
  -p 80:80 \
  certbot/certbot renew -n > tmp.log 2>&1
---

後はcrontabで15日に一回、回しておく。

$ crontab -e

1 2 */15 * * cd docker-mailserver; sh cert_renew.sh 

13. メールアドレス・エイリアスの追加

参考