こんにちは!
皆さんは開発中にメールを実送信して、
「あ、本番の人に届いた……」と冷や汗をかいたことはないでしょうか?
パスワードリセットを自分のアドレスに振り替えて、SES を叩いて、届くまで待つ。
一括送信のテストなんて、宛先を用意するのも確認するのも面倒です。
以前このブログでは Mailhog を紹介しました。
でも Mailhog はもうメンテされていません。
いま入れるなら Mailpit です!
§ 要約
Mailpit は開発用の SMTP サーバ兼、受信箱の Web UI です。
- アプリから送ったメールを本物の宛先には流さない
- ブラウザで本文・ヘッダ・添付まで見られる
- Mailhog と同じポート(SMTP 1025 / UI 8025)なので、だいたい差し替えられる
- Docker 一発で立つ
以上!終わり!
正直それで終わりにしてもいいのですが、せっかくなのでもう少し説明します。
§ Mailpit とは
公式サイトはこちらです。
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 です。
空の受信箱が出れば成功です。
§ 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 を見にいくだけです。
§ ブラウザで確認
一覧に今のメールが出ていれば成功です。
件名、宛先、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 に変えるだけで、だいたい終わります。
開発用のメール確認は、これで十分です!