docker-mailserverを使って独自ドメインのメールアドレスを自由に作る手順

近年ではEメールによるやり取りもだいぶ減ってきました。プライベートではLINEやインスタのDM、職場ではSlackやTeamsといったメッセージングアプリしか使わないという方も多くいることでしょう。

とは言うものの、「username@dagashi.pw」のような独自ドメイン形式のメアドを持てたらそれはそれでロマンを感じませんか?

今回は、独自ドメインのメアドを1つぐらい持っておきたい(もしくは実験的に持ってみたい)けど、わざわざGmailに課金して運用したりするほどモチベーションは高くない…といった方向けに、docker-mailserverというDockerイメージを利用して独自ドメインのメールアドレスを扱うことのできるメールサーバーを建てる手順をご紹介します。

本来であればメールサーバーを自前で建てるのはかなり面倒くさそうなのですが(参考)、このdocker-mailserverを使うと比較的簡単に自前のメールサーバーを建てることができます。

他サイトの解説ではDNSレコードの設定の説明が省かれているところも多かったのですが、メールサーバー周りに疎い自分からすると、メールサーバー用のDNSレコードの設定内容の知見も無い状態でわかりにくかったので、このページではDNSレコードの設定内容も掲載しています。

CAUTION

この記事ではあくまで「独自ドメインのメールアドレスを使ってEメールを送受信することのできるメールサーバーを建てる」事を目的としているので、セキュリティについては一切考慮していません。また、筆者もこれといってメールサーバー周りに精通しているわけではないので、もしかしたら間違った発言をしてしまっているかもしれません。

必要なもの

  • Dockerの基礎知識
  • Docker(Docker Compose)が動くサーバー
  • 独自ドメイン

前提条件

今回はfugamaru@dagashi.pwというメールアドレスを作成し、実際にメールの送受信ができるところをゴールとします。

DNSレコードの設定

以下のようにDNSレコードを設定してください。(もちろんドメインはご自身のものに読み替えてください)

ホスト名タイプTTL内容優先度
dagashi.pwA3600サーバーのIPアドレス
dagashi.pwMX3600mail.dagashi.pw0
mail.dagashi.pwCNAME3600dagashi.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対応作業)をしていないせいかそのままでは普通にログインできなかったのでいくつか設定をします。

メーラーについて

今回は例としてThunderbirdを使用していますが、各自好きなメーラーを使っていただいても構いません。SparkというメーラーはMacとiOSで検証したところ認証で弾かれてしまい使えませんでした。iOSの純正メールアプリや、Outlookでは普通に認証が通りました。

SSL対応完了後にDockerコンテナのログを見たところSASL CRAM-MD5 authentication failed: Invalid authentication mechanismというエラーが発生していて、このページを読む限りではおそらくメーラー側の問題かと思われます。

まずは名前・メールアドレス・パスワードを入力し、左下にある手動設定をクリックします。

画像のようにホスト名ポート番号のフィールドを編集し、再テストをクリックしたあと完了をクリックします。

するとこんな感じでまっさらな状態の受信トレイが開けたかと思います。

実際にメールを送受信してみる

受信テスト

まずは受信テストからやってみましょうか。

こんな感じの大して面白みも無いようなメールをGmailから送信します。

メールを受信することができました!

送信テスト

送信についてですが、自分の場合GmailやiCloudのメールアドレスに送信しても送信の段階でエラーメールが来て弾かれてしまいました。迷惑メールフォルダーにすら入らないということです。

考察

この挙動になるのは、恐らく以前同じIPで試験的にメールサーバーを建てた時に、SSLやDKIM、SPF等何も設定していない状態でGmailにメールを送信したので、スパム扱いされてそのままSpamhausにIPが共有された→GmailやiCloudに送っても弾かれるようになったのかなと思っています。

なので普通に送信できる人もいるかもしれませんが正直分かりません。

一応この記事の後半でSpamhausのブラックリスト解除申請について触れています。

しょうがないので、捨てメアドを発行してそこにメールを送信してみることにします。

今月の頭に富山一人旅行で行った時に環水公園で撮影した、世界一美しいスタバと夜桜のコラボショットを添付しています。

ちゃんと画像付きで送信することができました👍

(応用編) 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_TYPEletsencryptを指定します。

続けて、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に向けてメールを送信してみましょう!

今回は毎年年末に行く「湘南の宝石」で撮影したシーキャンドルの画像を送ってみます。

キタ――(゚∀゚)――!!

しっかり受信トレイに入っていました。暗号化の署名なんかもしっかり確認できますね!

めでたしめでたし🍑

コメント

タイトルとURLをコピーしました