まとめ
- 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.ymlのservicesに指定した名前となる。 - ポートは 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 サーバを利用してのメール送信が普通になっているからこそ、逆にローカル (コンテナ) からメールを送信するのが難しくなっている、ということなのだと思います。
最後に、参考ページを挙げます。大変助けとなりました、ありがとうございました!
- mailhog/MailHog: Web and API based SMTP testing
- 公式ページ
 
 - 開発環境で役に立つメール送信テストツールたち | Metrocode.co
- 様々な MailHog 導入紹介ページの中で、唯一 mhsendmail を利用してもしなくてもいい、という点に触れられていました。
 
 - メールの送信(3)メール受信サービス Mailhog – ララジャパン
 
以上です。
