これは Craft CMS Advent Calendar 2020 23日目の記事です。
過去記事の「ローカル環境を Docker で構築してみた」で触れている通り、Docker を利用してローカル環境を用意しています。その際「スキルの問題で sendmail を利用できるようにするのが大変」というネックがあり、外部の SMTP 経由でシステムからの送信テストを行っていました。
とはいえ、「大量に送信テストしたい」とか「オフラインでも動作確認したい」などと考えるうちに、MailHog のコンテナを立ててメールの送受信テストはそれを利用するようになったので、その方法についてまとめてみます。
事前準備
docker-composer.yml の作成
MailHog 用のプロジェクトディレクトリで docker-composer.yml
を作成します。
version: '3'
services:
mailhog:
container_name: mailhog
image: mailhog/mailhog
restart: always
volumes:
- ./mailhog:/tmp
environment:
MH_STORAGE: maildir
MH_MAILDIR_PATH: /tmp
ports:
- 8025:8025
- 1025:1025
networks:
default:
external:
name: webproxy
Docker Hub の公式イメージを利用しつつポート番号を指定しておけば問題ありませんが、サンプルでは nginx のリバースプロキシと同じネットワークにするための設定を行ったり、ボリュームを指定して受信メールを保持するなどの調整を加えています。
コンテナの起動
$ docker-compose up -d --build
初回のみ --build
を付けて、コンテナの生成も行います。
起動したら http://localhost:8025/ にアクセスできることを確認しておきましょう。
Craft CMS のメール設定を修正
管理画面の操作に先立ち、システムのインストールディレクトリにある .env
へ次の設定を追記します。
# システムのメール設定
SMTP_HOST_NAME ="mailhog"
SMTP_PORT ="1025"
続けて Craft CMS の管理画面で「設定 > メール」に移動し、次の内容を入力してから 保存
します。
ラベル | 値 |
---|---|
輸送タイプ | SMTP |
ホストネーム | $SMTP_HOST_NAME |
ポート | $SMTP_PORT |
認証を使う | OFF |
Encryption Method | なし |
タイムアウト | 10 |
テスト
ボタンをクリック後、MailHog にテストメールが届いていれば完了です。
これでユーザー登録やフォーム系プラグインの通知メールをすべて MailHog が受信するため、心置きなくテストできますね。
余談
システム側で SMTP を利用できない(または、どうしても sendmail を使いたい)場合、はじめにウェブサーバーの Dockerfile で mhsendmail
をインストールするようにします。
# install mhsendmail
# ----------
RUN curl -sSL https://github.com/mailhog/mhsendmail/releases/download/v0.2.0/mhsendmail_linux_amd64 -o mhsendmail \
&& chmod +x mhsendmail \
&& mv mhsendmail /usr/local/bin/mhsendmail
次に php.ini で sendmail_path
を指定します。
# sendmail for mailhog
[Mail]
sendmail_path = "/usr/local/bin/mhsendmail --smtp-addr=mailhog:1025"
その後、コンテナを作り直せば「設定 > メール設定」の 輸送タイプ = Sendmail
でも動くようになるハズです。