Docker ComposeでMailpitを構築:MailHogに代わるメールテストの新定番

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

課題:テストメールを顧客の本番インボックスに送らないために

開発者なら誰しも、本番データベース上で誤ってメール送信スクリプトを実行してしまい、肝を冷やした経験があるのではないでしょうか。一瞬の不注意で、何千人もの顧客に「テストメール 123」といった内容が届いてしまう。かつて、このような惨事を防ぐための定番ツールといえばMailHogでした。しかし、MailHogは長らくメンテナンスが停止しており、大容量の添付ファイル付きメールの処理でフリーズしたり、UIが古いためブラウザが重くなったりすることがよくあります。

後継として6ヶ月間 Mailpit を使用してきましたが、これは非常に価値のあるアップグレードだと断言できます。Go言語で書かれたMailpitは、応答速度が驚くほど高速です。SMTPサーバーを完璧にエミュレートしながら、外部のインターネットにはメールを送信しません。すべてのデータは開発マシンやステージングサーバー内に完結します。

なぜMailpitはMailHogより優れているのか?

Mailpitは単なるメールの「ブラックホール」ではありません。コンパクトながらも多機能なエコシステムです。

  • SMTP Server: Laravel、Node.js、Pythonなどからの要求を高速に受信します。
  • Web UI: モダンなインターフェースで、ダークモードやマルチデバイスでのプレビューに対応しています。
  • パフォーマンス: MailHogが数百MB消費することもあるのに対し、Mailpitের RAM消費量はわずか20-30MB程度です。
  • 強力なAPI: インテグレーションテストのスクリプト作成や、メール内容の自動検証に適しています。

最大の利点は検索機能です。Mailpitなら、何千通ものメールの中から件名や宛先で瞬時にフィルタリングできます。

Docker ComposeによるMailpitのデプロイ

Docker Composeを使えば、OSを汚さずに素早くセットアップできます。わずか数行の設定で、プロフェッショナルなテスト環境が手に入ります。

1. docker-compose.ymlファイルの作成

mail-test-labディレクトリを作成し、以下の内容でdocker-compose.ymlを保存します。

version: '3.8'

services:
  mailpit:
    image: axllent/mailpit:latest
    container_name: mailpit
    restart: always
    ports:
      - "8025:8025" # Web UI用
      - "1025:1025" # SMTPサーバー用
    environment:
      - MP_MAX_MESSAGES=5000
      - MP_DATABASE=/data/mailpit.db
      - TZ=Asia/Ho_Chi_Minh
    volumes:
      - ./mailpit-data:/data

2. 注意すべきパラメータ

  • Port 8025: ブラウザから管理画面にアクセスするためのポートです。
  • Port 1025: アプリケーションが接続するSMTPポートです。
  • MP_MAX_MESSAGES: 開発マシンのストレージを圧迫しないよう、通常は5000通程度に制限します。
  • Volumes: ボリュームのマウントを忘れないでください。これがないと、Dockerを再起動するたびに過去のテストメールがすべて消えてしまいます。

3. 起動

ターミナルを開き、以下のコマンドを1つ実行するだけです。

docker compose up -d

これで、http://localhost:8025にアクセスすれば、Mailpitのインターフェースがアプリからの最初のメールを待機しているはずです。

アプリケーションからMailpitへの接続

テストとして、nodemailerライブラリを使用したNode.jsのスクリプトを使用します。LaravelやDjangoなどのフレームワークでも設定方法は同様です。

const nodemailer = require("nodemailer");

async function main() {
  let transporter = nodemailer.createTransport({
    host: "localhost",
    port: 1025,
    secure: false,
  });

  let info = await transporter.sendMail({
    from: '"ITエンジニア" <[email protected]>',
    to: "[email protected]",
    subject: "Mailpitテスト!",
    html: "<b>メールの内容が非常にスムーズに表示されます。</b>",
  });

  console.log("送信完了: %s", info.messageId);
}

main().catch(console.error);

スクリプトを実行すると、Web UIに即座にメールが表示されます。HTMLのレイアウト崩れがないか、添付ファイルのリンクが正しく動作するかなどを確認できます。

実践的なアドバイス:よくあるネットワークエラー

Dockerを使用する際によくある間違いは、MAIL_HOSTの設定です。アプリケーションもコンテナ内で実行されている場合、localhostは使用しないでください。Docker環境では、localhostはMailpitではなく、アプリ自身のコンテナを指してしまいます。

解決策は、MAIL_HOSTをComposeファイルで定義したサービス名(例:MAIL_HOST=mailpit)に変更することです。

もう一つのTips:Mailpitには**Check Spam Score**機能があります。メールをクリックして上部のタブを確認すると、重要なヘッダーが欠落していないかチェックできます。これにより、将来的に本番メールが迷惑メールフォルダに振り分けられるのを防ぐことができます。

チームのワークフローを強化する

全員が個別にローカル環境で実行する代わりに、チーム共通のステージングサーバーにMailpitをデプロイしましょう。テスト環境からのすべてのメールが集約されます。テスターは開発者にスクリーンショットを依頼することなく、自ら内容を確認できるようになります。

さらに、Mailpitは自動**スクリーンショット**機能をサポートしています。メールをレンダリングし、さまざまな画面サイズでの見え方をキャプチャします。これは、iPhoneやデスクトップの両方でメールのデザインが美しく保たれているかを確認するための非常に便利な機能です。

結論

MailHogからMailpitへの移行は、故障がちな古い車から最新の新車に乗り換えるようなものです。スムーズで高速、そして機能も充実しています。Docker Composeを使えば、この環境構築は非常にプロフェッショナルかつチーム内での共有も容易になります。

ぜひ今日から導入してみてください。メールを待つ時間を何時間も節約でき、顧客に誤ってメールを送ってしまう不安からも完全に解放されるはずです。

Share: