初心者が Rocky Linux 8 で Postfix + Devecot のメールサーバーを Docker で実行するために、 docker-mailserver を利用する

## ドキュメント
英語が読める人は、こんな記事読んでないでドキュメント読んで下さい。

https://docker-mailserver.github.io/docker-mailserver/latest/

間違っていたらコメントで御教示下さい
## ０．　ゴール
- [Rocky Linux 8](https://www.kagoya.jp/howto/it-glossary/develop/rockylinux/) で [Postfix](https://wa3.i-3-i.info/word11136.html) + [Devecot](https://engineer-ninaritai.com/linux-dovecot/) のメールサーバーを建てる。
- [SMTP](https://wa3.i-3-i.info/word14.html) と [IMAP](https://wa3.i-3-i.info/word1136.html) を使う。[POP3](https://wa3.i-3-i.info/word1135.html)は使いません。
- [docker-compose](https://qiita.com/gon0821/items/77369def082745d19c38) でお手軽に。
- yourname@mail.yourdomain.jp でメール送受信できるようにする。
- [Gmail に嫌われない](https://www.nri-secure.co.jp/blog/gmail-guideline-2023)ように、[SPF](https://wa3.i-3-i.info/word12303.html) / [DKIM](https://wa3.i-3-i.info/word13299.html) / [DMARC](https://www.nri-secure.co.jp/glossary/dmarc) に対応する。
- そのために必要な [DNS](https://wa3.i-3-i.info/word1287.html) の登録もする。
- [Let's encrypt](https://ssl.sakura.ad.jp/column/letsencrypt/) も使う。

:::note info
domain は yourname@mail.yourdomain.jp
letsencrypt 更新通知用メールアドレスは ITSUMO.TSUKATTE.IRU@gmail.com 
としています。適宜読み替えてどうぞ。
:::
:::note info
以下はインストール済みとします。
- docker
- git
- ~~VSCode~~
:::
## １．　ダウンロード

お好きなディレクトリでどうぞ。
```bash
git clone https://github.com/docker-mailserver/docker-mailserver.git
cd docker-mailserver
```

## ２．　設定①　mailserver.env の設定
```bash
cd docker-mailserver
vim mailserver.env
```
~~Vim なんて使わず VSCode を使いましょう~~
```diff
# 14行目
- OVERRIDE_HOSTNAME=
+ OVERRIDE_HOSTNAME=mail.yourdomain.jp

# 77行目
- TZ=
+ TZ=Asia/Tokyo

# 241行目
- SSL_TYPE=
+ SSL_TYPE=letsencrypt
+ LETSENCRYPT_HOST=mail.yourdomain.jp
+ LETSENCRYPT_EMAIL=ITSUMO.TSUKATTE.IRU@gmail.com
```


## ３．　設定②　compose.yaml の設定
```bash
vim compose.yaml
```
hostname と Let's encrypt の Docker Volume の設定を追加します。
```diff
  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.yourdomain.jp
      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/letsencrypt:/etc/letsencrypt
      restart: always
      stop_grace_period: 1m
      # Uncomment if using `ENABLE_FAIL2BAN=1`:
      # cap_add:
      #   - NET_ADMIN
      healthcheck:
        test: "ss --listening --tcp | grep -P 'LISTEN.+:smtp' || exit 1"
        timeout: 3s
        retries: 0
```

## ４．　立ち上げてみる
```bash 
docker compose up
```
バックグラウンドで起動したいなら
```bash 
docker compose up -d
```
メールアドレスが追加されていない場合は、2分でシャットダウンします。それまでに、次へ GO！


## ５．　メールアドレスを追加する
yourname@mail.yourdomain.jp だけじゃなく info@mail.yourdomain.jp も追加したいよ〜って思ったら、 `username` を `info` に変更して、この作業を繰り返して下さい。
`SecurePassword` も強いパスワードに変更して下さい。
```bash
# docker compose を起動した状態で
# メールアドレスを追加するなら
sudo docker exec -it mailserver setup email add username SecurePassword

# パスワードを変更するなら
sudo docker exec -it mailserver setup email update username UpdatedSecurePassword

# 追加されているメールアカウントを確認するなら
sudo docker exec -it mailserver setup email list
```
詳しいコマンドは

https://docker-mailserver.github.io/docker-mailserver/latest/config/user-management/

## ６．　DKIM の設定
https://docker-mailserver.github.io/docker-mailserver/latest/config/best-practices/dkim_dmarc_spf/
```bash
docker exec -it mailserver setup config dkim
```
作成した公開鍵を表示します。yourdomain は変更して下さい。
```bash
sudo cat docker-data/dms/config/opendkim/keys/mail.yourdomain.jp/mail.txt
# mail._domainkey IN TXT ( 
#     "v=DKIM1; h=sha256; k=rsa; "
#     "p=公開鍵データを表す長い文字列"
#     "続きの分割されていた文字列" 
# )  ; ----- DKIM key mail for mail.yourdomain.jp
```
何らかの手段で、それらをコピーしておいてください。

## ７．　DNS の設定
| タイプ | 名称 | TTL | 値 |
|:-|:-|:-:|:-|
|  A| mail | 3600 | メールサーバーの IP アドレス |
| MX| mail | 3600 | ポイント先：mail.yourdomain.jp ｜ 優先度：10 |
|TXT| _dmarc.mail | 3600 | 下記参照 |
|TXT| mail._domainkey | 3600 | 下記参照 |

##### _dmarc.mail の値
改行せず1行で入力します。
- rua：追加したメールアドレスを全て列挙する
- ruf：失敗レポートの送り先
```
v=DMARC1; p=quarantine; pct=100;
rua=mailto:yourname@mail.yourdomain.jp,
rua=mailto:mouhitotsuno@mail.yourdomain.jp,
ruf=mailto:ITSUMO.TSUKATTE.IRU@gmail.com 
```
https://www.naritai.jp/guidance_record.html

##### mail._domainkey の値
ダブルクオート`"`を取り除き、分割されていた`p値`を結合して、改行せず1行で入力します。
```
v=DKIM1; h=sha256; k=rsa; 
p=公開鍵データを表す長い文字列と続きの分割されていた文字列を結合したやつ
```

## ８．　完了！
お好きなメールクライアントソフトで、ログインしてみましょう！
無事、送受信ができたら設定完了です！
**お疲れ様でした。**

## 参考資料＆初心者でない方の丁寧な記事たち

##### docker-mailserverで簡単(?)メールサーバ構築 - 2022/06/03
https://qiita.com/idani/items/cc160fa49681919aa215

##### docker-mailserverをさくっと立ち上げる(令和4年2月版) - 2022/04/22
https://zenn.dev/takaha/articles/docker-mailserver

##### docker-mailserverの設定 - 2022/05/02
https://zenn.dev/takaha/scraps/8598b62ab4b872

##### docker メールサーバ構築 (docker-mailserver)
https://scrapbox.io/cmdtips/%F0%9F%90%B3_docker_%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89_(docker-mailserver)