メール鯖をDockerへ移行した
神か?
超参考
以前構築した記事
定義
- Host:
mail
- Domain:
sample.com
- MailUser:
user1
- SSL/TLS証明書:
/mnt/certificate/{cert,privkey}.pem
- RelayHost:
mail.so-net.ne.jp
- RelayHostPort:
587
- RelayHostUser:
hogehoge@aa.so-net.ne.jp
- RelayHostPass:
hogegenoge
構築
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
docker-compose.yml
version: '3.8'
services:
mailserver:
image: docker.io/mailserver/docker-mailserver:latest
container_name: mailserver
hostname: mail
domainname: sample.com
env_file: mailserver.env
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)
#- "110:110" # POP3
- "995:995" # POP3 (with 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
- /mnt/certificate:/mnt/ssl:ro
restart: always
stop_grace_period: 1m
cap_add:
- NET_ADMIN
- SYS_PTRACE
diff mailserver.env
diff -u mailserver.env.orig mailserver.env | grep ^+
変更分のみ。
+OVERRIDE_HOSTNAME=sample.com
+POSTMASTER_ADDRESS=user1@mail.sample.com
+ENABLE_POP3=1
+SSL_TYPE=manual
+SSL_CERT_PATH=/mnt/ssl/cert.pem
+SSL_KEY_PATH=/mnt/ssl/privkey.pem
+POSTFIX_INET_PROTOCOLS=ipv4
+DEFAULT_RELAY_HOST=[mail.so-net.ne.jp]:587
+RELAY_HOST=mail.so-net.ne.jp
+RELAY_PORT=587
+RELAY_USER=hogehoge@aa.so-net.ne.jp
+RELAY_PASSWORD=hogegenoge
ハマりポイント
Postfixの基本的な設定がわかっていればハマることはほとんどないと思う。
が、一点だけクソハマったので書き残しておく。
OVERRIDE_HOSTNAME
がないと
mail postfix/trivial-rewrite[1670]: warning: do not list domain mail.sample.com in BOTH mydestination and virtual_mailbox_domains
mail postfix/smtpd[1420]: NOQUEUE: reject: RCPT from unknown[{送信元Addr}]: 550 5.1.1 <user1@mail.sample.com>: Recipient address rejected: User unknown in local recipient table; from=<{送信元メアド}> to=<user1@mail.sample.com> proto=ESMTP helo=<{送信元メアド}>
というエラーが出て「えぇ?ユーザーいるじゃん???」という頭になってしまう。
エラーにも書いてある通り、mydestination
と virtual_mailbox_domains
の中身が被っていることが原因なので、どちらかを変えればOK。
このことに関する参考はこちら
Postfixの『Recipient address rejected: User unknown in local recipient table』で15分ほどハマった話
LANからはすべてのアクセスを許可する
docker-data/dms/config/postfix-main.cf
にPostfixの設定を書けばDocker内のPostfixの main.cf
の対象部分を上書いてくれる。
なにもしなければ
mynetworks = 127.0.0.0/8 [::1]/128 [fe80::]/64 192.168.64.2/32
になるが、LANからすべて許可したいので
mynetworks = 10.0.0.0/24 127.0.0.0/8 [::1]/128 [fe80::]/64 192.168.64.2/32
を記述して保存すればOK。
初回起動時
とりあえず上記のように設定だけ済ませる。
docker-compose up [-d]
をせずにまずはメールアドレスを追加する
# メアド追加
./setup.sh email add user1@mail.sample.com
# postmasterのalias追加
./setup.sh alias add postmaster@mail.sample.com user1@mail.sample.com
# メアド確認
./setup.sh email list
# alias確認
./setup.sh alias list
これをすることで user1@mail.sample.com
が追加され、postmaster@mail.sample.com
にきたものを前者に転送することができる。
./setup.sh alias add postmaster user1@mail.sample.com
というように@以降を省略もできるのだがうまく動作しなかったためフルで書くべき。
ちなみに postmaster
は email add
しなくて良い。(すると転送されない)
たったこれだけで完璧なメール鯖を構築できる。
Docker様様や。
おわり
これで無事に送受信ができることを確認した。
4時間もかかってしまった…