開発中のメールは Mailpit で確認する

LaravelphpDocker
開発中のメールは Mailpit で確認する

こんにちは!

皆さんは開発中にメールを実送信して、
「あ、本番の人に届いた……」と冷や汗をかいたことはないでしょうか?

パスワードリセットを自分のアドレスに振り替えて、SES を叩いて、届くまで待つ。
一括送信のテストなんて、宛先を用意するのも確認するのも面倒です。

以前このブログでは Mailhog を紹介しました。
でも Mailhog はもうメンテされていません。
いま入れるなら Mailpit です!


§ 要約

Mailpit は開発用の SMTP サーバ兼、受信箱の Web UI です。

  • アプリから送ったメールを本物の宛先には流さない
  • ブラウザで本文・ヘッダ・添付まで見られる
  • Mailhog と同じポート(SMTP 1025 / UI 8025)なので、だいたい差し替えられる
  • Docker 一発で立つ

以上!終わり!
正直それで終わりにしてもいいのですが、せっかくなのでもう少し説明します。


§ Mailpit とは

公式サイトはこちらです。

https://mailpit.axllent.org/

axllent さんが作っている、Go 製のメールテスト用ツールです。
単一バイナリでも Docker でも動きます。依存がほぼ無いのが気持ちいいです。

役割はシンプルで、開発中のメールを全部捕まえて、ブラウザで確認することです。
Git でいうと tig みたいな「見る専用の道具」に近いです。
送るのはアプリ側、見るのは Mailpit。それだけです。


§ なぜ Mailhog じゃないのか

Mailhog は長年の定番でした。
ただし 2020 年以降、実質止まっています。セキュリティ更新も期待しない方がよいです。

Mailpit はその穴を埋める後継です。コードは別物ですが、

  • SMTP は 1025
  • Web UI は 8025

と、ポートが同じなので、既存の .env をほぼいじらずに乗り換えられます。

UI の検索、HTML のプレビュー、arm64 イメージ、軽さ。
いま新規で Mailhog を入れる理由は、ほぼ無いと思います。


§ Docker で起動

とりあえず触るならこれだけです。

$ docker run -d --name mailpit -p 1025:1025 -p 8025:8025 axllent/mailpit

立ったらブラウザで開きます。https ではなく http です。

http://localhost:8025

空の受信箱が出れば成功です。


§ compose に足す

普段の開発は compose に置いた方が楽です。
既存の Laravel 用 compose なら、サービスを 1 つ足すだけです。

services:
  mailpit:
    image: axllent/mailpit
    ports:
      - "8025:8025"
      - "1025:1025"

アプリから見るホスト名はサービス名です。
この例なら mailpit、ポートは 1025

UI だけホストから見たい場合、SMTP の 1025:1025 は省略しても動きます。
コンテナ同士なら内部ポートだけで届きます。


§ アプリの向き先

Laravel なら .env はだいたいこうです。
以前の Mailhog 記事とほぼ同じで、ホスト名だけ変えます。

MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS=info@example.com

MAIL_USERNAME / MAIL_PASSWORD / MAIL_ENCRYPTION の行は消さないでください。
無くすと送信時に落ちることがあります。昔からそうです。

Mailhog 時代の MAIL_HOST=container_mailhog を使っているなら、
サービス名に合わせて書き換えるか、compose 側のサービス名を揃えてください。

tinker での試し打ちも、以前と同じで大丈夫です。

$ docker compose exec php php artisan tinker
>>> Mail::raw('test email body', function ($email) { $email->to('hoge@piyo.com')->subject('test email subject'); });

null が返ってきたら、あとは UI を見にいくだけです。


§ ブラウザで確認

http://localhost:8025

一覧に今のメールが出ていれば成功です。
件名、宛先、HTML プレビュー、ソース、添付まで、ここで完結します。

AWS 上で動かしている人は、セキュリティグループで 8025 を開けてください。
開ける相手は自分だけにしましょう。開発用の受信箱を全世界に出す必要はありません。


§ まとめ

やることはこれだけです。

$ docker run -d --name mailpit -p 1025:1025 -p 8025:8025 axllent/mailpit

アプリの SMTP を mailpit:1025(または localhost:1025)に向ける。
ブラウザで http://localhost:8025 を開く。

Mailhog をまだ使っているなら、イメージを axllent/mailpit に変えるだけで、だいたい終わります。
開発用のメール確認は、これで十分です!

この記事をシェアする