まとめ
- 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 – ララジャパン
以上です。