Craft CMS のテストメールを MailHog で受信する

これは 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 を付けて、コンテナの生成も行います。

MailHog の画面サンプル

起動したら 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 の画面サンプル

これでユーザー登録やフォーム系プラグインの通知メールをすべて 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 でも動くようになるハズです。