【Docker】ローカル開発環境にMailHogを導入してみた

触っているプログラムがどんな環境であれ本番メールを送る設定になっていて、サンプルで登録した情報にうっかりメールを送ってしまいそうなので、ローカルではMailHogを使うようにしましたという話






1. Dockerでコンテナを生成

docker-compose.yml に以下を追加します。

mail:
 image: mailhog/mailhog:latest
 container_name: mailhog
 restart: always
 ports:
   - 8025:8025
   - 1025:1025


僕の環境ではproxy経由で複数ネットワークが動いているので、MailHog用のdocker-compose.ymlを別途用意しました。


version: '3.8'

services:
 mail:
   image: mailhog/mailhog:latest
   container_name: mailhog
   restart: always
   ports:
     - 8025:8025
     - 1025:1025
   networks:
     - proxy-network

networks:
 proxy-network:
   name: proxy_network

参考

ローカルのDockerで複数サービスを動かしproxyでドメインを捌くようにしてみた – NOBODY:PLACE



2. mhsendmail をインストール

フレームワークのメール送信機能を使っている場合には、SMTPサーバを指定出来ると思うので必要ありません。現在の環境ではデフォルトのsendmailを使用するようになっているので、それをMailHog用のsendmail、mhsendmailに置きかえます。

Dockerfileに以下を追記

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

参考

DockerでMailHogを使ってPHPのメール送信確認をする – Qiita



3. sendmail_path を書き換え

こちらもフレームワークを使用している場合には必要ありません。

メール設定用の ini ファイルを作成

[mail function]
sendmail_path = "/usr/local/bin/mhsendmail --smtp-addr=mailhog:1025"


docker-composeにて配置(設定例/抜粋)

    volumes:
     - ./app/php.ini:/usr/local/etc/php/php.ini
     - ./app/mail.ini:/usr/local/etc/php/conf.d/mail.ini

参考

DockerでMailHogを使ってPHPのメール送信確認をする – Qiita



4. docker-compose を再起動

docker-compose down
docker-compose up --build -d


5. メール送信テスト

メール送信(PHP)

mail(
 'test@example.com',
 'テスト',
 'テスト本文',
 'From: from@example.com'
);

受信確認

http://localhost:8025 にアクセスしてメールが受信できていることを確認します。




OK!



その後の設定・改修

プログラムのメール送信部分にいくつか設定・改修する部分があります。


  • ローカル開発環境で動かしているときにはMailHogに送るようにする
  • 日本語を送信すると文字化けするので対応する
  • プレーンテキストとHTMLメール両方を送る(マルチパート)ようにする


現在は外部のメール送信サービスを利用して送信していて、それぞれ意識せずに対応してくれているんですけど、mb_send_mail() ではそれが出来なくなるので。ていうかむしろもうPHPMailerとかSwiftMailerとか入れて送った方が楽なのかも知れません。脆弱性は心配だけどローカルだけだし、その場合、2と3は必要なくなるわけですしね……要検討。