カテゴリー
コンピューター

Laravel 6 のメールの絡む開発用に MailHog の Docker コンテナを構築する方法のメモ

まとめ

  • Docker 側のコードは mailhog/mailhog イメージを使うだけ。
  • Laravel 側では、 .env を変更するだけ。

MailHog を導入するためのコード修正

.devcontainer/docker-compose.yml を修正しました。参考ページを見ると、 1025 ポートも開けていましたけれども、不要でした。今回の場合、メールはコンテナの外からコンテナの中に対して 1025 ポートで通信をするわけではなく、コンテの中同士で通信をするはず、という予想通りでした。

また、 MailHog は あくまで開発時に使用するものなので、開発用の docker-compose.yml ファイルに記述いたしました。

$ git diff .devcontainer/docker-compose.yml
diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml
index 9d801d4..682cdcd 100644
--- a/.devcontainer/docker-compose.yml
+++ b/.devcontainer/docker-compose.yml
@@ -36,3 +36,7 @@ services:
     # Overrides default command so things don't shut down after the process ends.
     #command: /bin/sh -c "while sleep 1000; do :; done"

+  mailhog:
+    image: mailhog/mailhog
+    ports:
+        - "8025:8025"
$

続いて、 Laravel からどうやってメールを送信するかの設定を記述しました。

  • メールのドライバーは smtp を指定する。
  • ホストは mailhog だが、これは docker-compose.ymlservices に指定した名前となる。
  • ポートは 1025 で、 MailHog が指定する初期値となる。
  • ユーザー名、パスワードはテキトーで、他のページを見るとおそらく null でも問題ない。
  • 他の項目は変更していない。
MAIL_DRIVER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=user
MAIL_PASSWORD=password
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=null
MAIL_FROM_NAME="${APP_NAME}"

今回のメインはこれだけです。

次に記載するコード変更は、おまけです。

Docker コンテナ内の Laravel から外部サービスを使わずにメールを送信するために Docker コンテナ内に exim4 をインストールしたらできた、という記録 – oki2a24 にて、コンテナに exim4 をインストールしてコンテナからメール送信を可能にしました。けれども、今回 MailHog を試すために php/Dockerfile に追加していた exim4 のインストール部分をあえてコメント化しておきました。

$ git diff php/Dockerfile
diff --git a/php/Dockerfile b/php/Dockerfile
index 8f2897b..1b3b45c 100644
--- a/php/Dockerfile
+++ b/php/Dockerfile
@@ -59,13 +59,13 @@ COPY ./php/crontabs/ /var/spool/cron/crontabs/
 RUN ln -sfT /dev/stdout /var/log/cron
 CMD ["/usr/bin/supervisord"]
 # sendmail
-RUN apt-get update && apt-get install -y --no-install-recommends \
-  exim4-daemon-light \
-  mailutils \
-  msmtp \
-  && apt-get clean && rm -rf /var/lib/apt/lists/*
-COPY ./php/php/sendmail.ini /usr/local/etc/php/conf.d/
-COPY ./php/exim4/update-exim4.conf.conf /etc/exim4/update-exim4.conf.conf
-RUN service exim4 reload
+#RUN apt-get update && apt-get install -y --no-install-recommends \
+#  exim4-daemon-light \
+#  mailutils \
+#  msmtp \
+#  && apt-get clean && rm -rf /var/lib/apt/lists/*
+#COPY ./php/php/sendmail.ini /usr/local/etc/php/conf.d/
+#COPY ./php/exim4/update-exim4.conf.conf /etc/exim4/update-exim4.conf.conf
+#RUN service exim4 reload

 FROM shared AS develop
$

テストメールの送信を試す。

次のコードを試してメールを送信してみました。 http://localhost:8025 にアクセスしてみましたところ、無事、メールが届いておりました♪

小ネタとして、日本語はもちろん、絵文字も問題なく扱うことができました。

php artisan tinker

Mail::raw('これはテストです。php artisan tinker から送信した。😇', function($m) { $m->subject('これはテストです tinker😀')->from('from@example.com', 'Laravel')->to('to@example.com'); });

おわりに

前回の Docker コンテナ内の Laravel から外部サービスを使わずにメールを送信するために Docker コンテナ内に exim4 をインストールしたらできた、という記録 – oki2a24 の苦労はなんだったのでしょう! といいたくなるほど簡単でした。

余談ですけれども、外部の SMTP サーバを利用してのメール送信が普通になっているからこそ、逆にローカル (コンテナ) からメールを送信するのが難しくなっている、ということなのだと思います。

最後に、参考ページを挙げます。大変助けとなりました、ありがとうございました!

以上です。

コメントを残す