近年ではEメールによるやり取りもだいぶ減ってきました。プライベートではLINEやインスタのDM、職場ではSlackやTeamsといったメッセージングアプリしか使わないという方も多くいることでしょう。
とは言うものの、「username@dagashi.pw」のような独自ドメイン形式のメアドを持てたらそれはそれでロマンを感じませんか?
今回は、独自ドメインのメアドを1つぐらい持っておきたい(もしくは実験的に持ってみたい)けど、わざわざGmailに課金して運用したりするほどモチベーションは高くない…といった方向けに、docker-mailserverというDockerイメージを利用して独自ドメインのメールアドレスを扱うことのできるメールサーバーを建てる手順をご紹介します。
本来であればメールサーバーを自前で建てるのはかなり面倒くさそうなのですが(参考)、このdocker-mailserverを使うと比較的簡単に自前のメールサーバーを建てることができます。
他サイトの解説ではDNSレコードの設定の説明が省かれているところも多かったのですが、メールサーバー周りに疎い自分からすると、メールサーバー用のDNSレコードの設定内容の知見も無い状態でわかりにくかったので、このページではDNSレコードの設定内容も掲載しています。
必要なもの
- Dockerの基礎知識
- Docker(Docker Compose)が動くサーバー
- 独自ドメイン
前提条件
今回はfugamaru@dagashi.pw
というメールアドレスを作成し、実際にメールの送受信ができるところをゴールとします。
DNSレコードの設定
以下のようにDNSレコードを設定してください。(もちろんドメインはご自身のものに読み替えてください)
ホスト名 | タイプ | TTL | 内容 | 優先度 |
dagashi.pw | A | 3600 | サーバーのIPアドレス | – |
dagashi.pw | MX | 3600 | mail.dagashi.pw | 0 |
mail.dagashi.pw | CNAME | 3600 | dagashi.pw | – |
TTLはお好みで、MXレコードの優先度はとりあえず最優先である0
を指定しておきました。
ちなみにGoogleドメインとかだと、内容
と優先度
のフィールドが一緒になっていたりするのですが、0 mail.dagashi.pw
という風に入力すれば設定できます。
各種ファイルの用意
mkdir mailserver
cd 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
公式ドキュメント通りにやると何故か404が返ってきたのでZennの記事を引用させていただきました。
docker-compose.ymlの編集
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.example.com # ←この行を書き換える! 自分の場合はmail.dagashi.pwに書き換えた
env_file: mailserver.env
# More information about the mail-server ports:
# https://docker-mailserver.github.io/docker-mailserver/latest/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
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
用意したdocker-compose.yml
を開くとデフォルトではこのようになっていると思います。
これの6行目、hostname
の箇所を先程DNSレコードに設定したmail
というサブドメインがついたFQDNに置き換えます。
コンテナの起動
docker-compose up -d
docker-compose.ymlの編集が完了したら早速コンテナを起動してみましょう!
コンテナの起動中すごい数のログが流れてきますがお使いのPCは正常です😇
メールアドレスの作成
コンテナが無事起動したら、メールアドレスを作成しましょう。
./setup.sh email add fugamaru@dagashi.pw パスワード
./setup.sh alias add postmaster@dagashi.pw fugamaru@dagashi.pw
メールアドレスを作成したあと、そのアドレスをPostmasterのエイリアスとして登録しています。
(くどいですがメアドとパスワードは自分の作成したいものに読み替えてください)
Postmasterについて
メールサーバーの管理者アカウントのことです。例えば、Eメールを送信したらエラーメールが返ってきたなんていう経験ありませんか?
実はあのエラーメールはPostmaster名義のアドレスで送信されていたりします。
setup.shについて
docker-mailserverの設定用シェルスクリプトです。メールアドレスの追加といった各種設定はdocker exec
でコンテナに入って直接実行するのではなく、このsetup.sh経由で行います。
公式ドキュメントのこの項の中間あたりにコマンド一覧が載っています。
setup.shのemail update
コマンドが誕生する経緯となったGitHubのIssueなんかも見つけたのですが、読み応えがあって面白かったです。パスワードが変更したくなったらぜひ使いましょう。
メーラーからログインする
メールアドレスの作成も完了したところで、早速今作ったメールアカウントにログインしてみましょう。
と言いたいところですが、今回は暗号化の設定(SSL対応作業)をしていないせいかそのままでは普通にログインできなかったのでいくつか設定をします。
まずは名前・メールアドレス・パスワードを入力し、左下にある手動設定
をクリックします。
画像のようにホスト名
とポート番号
のフィールドを編集し、再テスト
をクリックしたあと完了
をクリックします。
するとこんな感じでまっさらな状態の受信トレイが開けたかと思います。
実際にメールを送受信してみる
受信テスト
まずは受信テストからやってみましょうか。
こんな感じの大して面白みも無いようなメールをGmailから送信します。
メールを受信することができました!
送信テスト
送信についてですが、自分の場合GmailやiCloudのメールアドレスに送信しても送信の段階でエラーメールが来て弾かれてしまいました。迷惑メールフォルダーにすら入らないということです。
しょうがないので、捨てメアドを発行してそこにメールを送信してみることにします。
今月の頭に富山一人旅行で行った時に環水公園で撮影した、世界一美しいスタバと夜桜のコラボショットを添付しています。
ちゃんと画像付きで送信することができました👍
(応用編) SSL・DKIM・SPF設定など
ここからは、今回作成したメールアドレスをよりセキュアに利用できるように設定していきます。
目標としては、「Gmailの(迷惑メールフォルダーではなく)受信トレイに入るメールを送信する」ことです。
現状ではGmail宛に送信すらできていないのと、SSL、DKIM、SPF周りの設定を怠った場合、Gmailは受け取ったメールを迷惑メールとして分類するのでその対策ということになります。
自分用の備忘録として書くので、説明は結構雑かもしれません。
今回の内容の応用として気になる方はぜひ試してみてください。
SSL対応
既にCertbotなどでメアドに使っているドメインに対応するLet’s Encryptの証明書を取得済みなのが前提条件です。(/etc/letsencrypt/live/
配下に証明書が存在すればOK)
docker-compose.ymlと同じ階層にあるmailserver.env
を開き
SSL_TYPE=letsencrypt
SSL_TYPE
にletsencrypt
を指定します。
続けて、docker-compose-yml
を開き
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 # ←追記
volumes
に/etc/letsencrypt:/etc/letsencrypt
を追記して、証明書をバインドマウントします。
ドメインはメアドから勝手に判定してくれるので特に「どのドメインの証明書を使う」というのは指定する必要ありません。
DKIM設定
./setup.sh config dkim
setup.shから、DKIMで使う鍵を生成します。
コマンド実行後./docker-data/dms/config/opendkim/keys/ドメイン/mail.txt
を開くと
mail._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; "
"p=MIICIjANBgkqhk817w0BAQEFAAOCAg8AMIICCgKCAgEA4Sml/WIrDIjF6udENNY0+HqVQE8U/451qRJ/zQdSf+kO9uNK6fL1T0d5IBFqg0wkARE2pmhGaY5O63t3sm28NFPSz3T7U3ibZqDMLZ9HIU33OBPEh1JppMI7kdkZmcrukN67OBQPsVF14ARbQdG4+iVjQyeEKn0ejssAQjEKSqzPEMpnB+jov31Nc3JnI365QPyPlyGxgTPgMZ" "DZmZcFpOBblfainVUzMrh2R7acnRV8wQwqItewVvejY7d7j7O52387oZGIUBYAIqrpJfnSOR6ddUHL4i6SYUGRPuuKZJDP1RNi6X6kpyuDlk/FGdItxkfEOYprbXlWjdx26t5qjix4KY27uZR62XgRet/+GLxUEu81woYBBz+qYEeF/9cbksKkNukQDbUtHIt9CNqF+yGYqJANtnfwM7DaVOmjrcl56I8bbmwaoE/nDM9Gmd4HgNQeq6Ai"
"FSlTsd9clygsO+9Seya3+Iwa6yn9Z1lye48dlok91jfviSefDmlA0mlDNA15pCpcAg8LgrQMP+pyq15LgrmDv7NlV2Qjv0N8wkquEBLSg116IGoDzbZRWPYv+B2efNnIuSLUz6XnKQz/N6T5VKEw/yVrm4qpYnCC0h24uOkh3cUvBnMVwoQ9oj0fMKvI1ZdOJtiHe4U5gdLhnshA4mVpLy3dQJQiY19xsX1MCAwEAAQ==" ) ; ----- DKIM key mail for ドメイン
中身がこんな風になっていると思うので
"v=DKIM1; h=sha256; k=rsa; p=MIICIjANBgkqhk817w0BAQEFAAOCAg8AMIICCgKCAgEA4Sml/WIrDIjF6udENNY0+HqVQE8U/451qRJ/zQdSf+kO9uNK6fL1T0d5IBFqg0wkARE2pmhGaY5O63t3sm28NFPSz3T7U3ibZqDMLZ9HIU33OBPEh1JppMI7kdkZmcrukN67OBQPsVF14ARbQdG4+iVjQyeEKn0ejssAQjEKSqzPEMpnB+jov31Nc3JnI365QPyPlyGxgTPgMZDZmZcFpOBblfainVUzMrh2R7acnRV8wQwqItewVvejY7d7j7O52387oZGIUBYAIqrpJfnSOR6ddUHL4i6SYUGRPuuKZJDP1RNi6X6kpyuDlk/FGdItxkfEOYprbXlWjdx26t5qjix4KY27uZR62XgRet/+GLxUEu81woYBBz+qYEeF/9cbksKkNukQDbUtHIt9CNqF+yGYqJANtnfwM7DaVOmjrcl56I8bbmwaoE/nDM9Gmd4HgNQeq6AiFSlTsd9clygsO+9Seya3+Iwa6yn9Z1lye48dlok91jfviSefDmlA0mlDNA15pCpcAg8LgrQMP+pyq15LgrmDv7NlV2Qjv0N8wkquEBLSg116IGoDzbZRWPYv+B2efNnIuSLUz6XnKQz/N6T5VKEw/yVrm4qpYnCC0h24uOkh3cUvBnMVwoQ9oj0fMKvI1ZdOJtiHe4U5gdLhnshA4mVpLy3dQJQiY19xsX1MCAwEAAQ=="
のように、間に挟まっている改行とダブルクォーテーションを消して連結させます。
そして、その連結させた文字列を
ホスト名をmail._domainkey
としてTXT
でDNSレコードに登録します。(Googleドメインの場合消したはずのダブルクォーテーションが勝手に挿入されるのは仕様)
SPF設定
ドメインに対してTXT
レコードで"v=spf1 mx ~all"
と設定します。
Spamhausのブラックリスト登録解除申請
参考: https://takublo.net/spamhaus/
注意事項としては、申請フォームに入力するメアドは個人のGmailアドレスではなく、ブラックリストに引っかかっているIPと紐付いているメアドを使用します。(今回の場合はfugamaru@dagashi.pw
)
あと、「解除完了しました」みたいなメールは特に来ませんでした。
設定確認
https://www.appmaildev.com/jp/dkim にアクセスして、次のステップ
ボタンをクリックして表示されたメアドに今回作成したメアドから空メールを送ります。(空メールとかもう死語ですよね。それとももはやメアド自体死語なの…?)
全ての項目をクリアしていればOKです。ちなみに、Spamhausのブラックリストに入っているかはRBL
で判断できます。
ブラックリストの解除申請をして少し経ってから確認をしたのでしっかりNotListed
にステータスが変わっています。
送信テストのリベンジ
準備は整ったので早速Gmailに向けてメールを送信してみましょう!
今回は毎年年末に行く「湘南の宝石」で撮影したシーキャンドルの画像を送ってみます。
キタ――(゚∀゚)――!!
しっかり受信トレイに入っていました。暗号化の署名なんかもしっかり確認できますね!
めでたしめでたし🍑
コメント