とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
読者登録と各種SNSのフォローもよろしくお願いいたします。

メールサーバーなし、Mailpitでメールを受ける

self-hostedな環境でアプリを動かしていると、Nextcloud、Wiki、その他各種サービスが「メール送信機能」を備えていますよね。本来なら外部のメールサーバーを設定して、実際にメールを送信することになります。

ただ、個人や小規模チームのホームラボなら、メール送信機能は「あればいい」けど「本物のメール」は要らないことがほとんどです。私自身もパスワードリセットくらいでしかつかったことがありません。そんなときに、わざわざメールサーバーを設定するのは過剰ですよね。

そこで活躍するのがMailpit。ローカルSMTPサーバーとしてメール送信を受け付けて、Web UIで確認できます。本来は開発環境用ですが、self-hostedな用途でも「メール送信機能は欲しいけど外部サーバーは要らない」という場面にぴったりです。

Mailpit

github.com

Mailpitは、開発環境でメール送受信機能をテストするための軽量なSMTPサーバーです。単一バイナリで動作し、依存関係がなく、Linux・macOS・Windowsで同じように使えます。古いMailHogの後継で、今も積極的に開発・保守されています。

Mailpitの特徴

1. ローカルSMTPサーバー

Mailpitを起動するだけで、ポート1025でSMTPサーバーが立ち上がります。アプリケーションをこのサーバーに向けるだけで、送信したメールをキャッチできます。実際のメールサーバーは不要です。

mailpit
# SMTP: localhost:1025
# Web UI: http://localhost:8025

2. モダンなWeb UI

送信されたメールはhttp://localhost:8025のWebUIで確認できます。HTMLメール、テキストメール、ヘッダー、添付ファイルまで、すべて見えます。

リアルタイム更新なので、メール送信と同時に画面に表示されます。検索・フィルター機能も充実しているので、多数のテストメールの中から特定のメールをすぐ見つけられます。

3. REST APIで自動テスト対応

Web UIだけでなく、REST APIも提供しています。統合テストでメール送信機能を検証できます。

# メール一覧取得
curl http://localhost:8025/api/v1/messages

# メール検索
curl "http://localhost:8025/api/v1/search?query=test@example.com"

# メール削除
curl -X DELETE http://localhost:8025/api/v1/messages/{id}

自動テストでメール内容を確認できるので、「メール送信が実行されたか」「正しい宛先に送信されたか」を自動で検証できます。

4. SMTP認証の柔軟な対応

アプリケーションが「SMTP認証が必須」という設定なら、Mailpitに認証を要求させることもできます。

# 任意のユーザー・パスワードを受け付ける
mailpit --smtp-auth-accept-any

この設定なら、どんなユーザー名・パスワードでも接続でき、わざわざ認証情報を厳密に管理する必要がありません。self-hostedな環境では非常に便利です。

5. Docker対応

公式のDockerイメージが用意されており、docker-composeで他のサービスと一緒に起動できます。

version: '3'
services:
  mailpit:
    image: axllent/mailpit
    ports:
      - "8025:8025"  # Web UI
      - "1025:1025"  # SMTP
    command: --smtp-auth-accept-any  # 認証設定が必須なアプリ向け

  app:
    build: .
    environment:
      MAIL_HOST: mailpit
      MAIL_PORT: 1025
      MAIL_USER: anyuser        # 何でもOK
      MAIL_PASSWORD: anypassword # 何でもOK
    depends_on:
      - mailpit

アプリケーションはコンテナ内からmailpit:1025でSMTPサーバーに接続でき、認証情報は任意です。

インストール方法

macOSの場合:

brew install mailpit

Linux(スクリプト)の場合:

curl -sL https://raw.githubusercontent.com/axllent/mailpit/develop/install.sh | sudo sh

GitHub Releasesから直接ダウンロードすることもできます。

基本的な使い方

Self-hostedな環境での使い方

例えばNextcloudを自宅サーバーで動かしていて、メール通知を有効にしたい場合:

  1. ホームラボのマシンでMailpitを起動(または Docker で)
  2. Nextcloudの管理画面で「メール設定」に進む
  3. SMTP ホストに Mailpit のサーバー名またはIPを指定(ポート1025)
  4. あとはいつも通りメール通知が必要な操作をする
  5. http://mailpit-server:8025 で受け取ったメール一覧を確認

実際の例(Nextcloud設定):

認証なしの場合:

メールサーバー: 192.168.1.100
SMTPポート: 1025
認証なし
送信元: noreply@homelab.local

認証が必須なアプリの場合(Mailpitを--smtp-auth-accept-anyで起動):

メールサーバー: 192.168.1.100
SMTPポート: 1025
ユーザー名: testuser
パスワード: testpass
送信元: noreply@homelab.local

どんな認証情報でも大丈夫です。本番環境のようにシステム複雑に する必要は全くありません。

開発環境での使い方

アプリを開発しているときのメール送信テスト:

Node.jsの場合:

const nodemailer = require('nodemailer');

const transporter = nodemailer.createTransport({
  host: 'localhost',
  port: 1025,
  secure: false
});

Spring Bootの場合(application.properties):

spring.mail.host=localhost
spring.mail.port=1025
spring.mail.protocol=smtp

Web UIでメール確認

http://localhost:8025(またはサーバーのIP:8025)にアクセスして、送信されたメール一覧を確認。HTMLレイアウト、リンク、画像の表示も確認できます。

Mailpit Web UI

CI/CDやテストでの活用

統合テストの際も、REST APIを使ってメール送信の確認を自動化できます。

# テスト実行
npm test

# テスト内でメール検証
curl http://localhost:8025/api/v1/messages
curl -X DELETE http://localhost:8025/api/v1/messages/{id}

まとめ

Mailpitは、「メール送信機能はいるけど、わざわざメールサーバー設定するほどでもない」という場面で活躍します。

Self-hosted環境で: Nextcloud、Wiki、その他自宅サーバーで動かしているアプリのメール通知機能を、外部メールサーバーなしで完結させられます。

開発環境で: テストメールの誤配信防止、REST APIでの自動テスト対応。

どちらの用途でも、単一バイナリで依存関係なく動作。MailHogの後継として、今も積極的に開発が続いています。

ホームラボで「このアプリ、メール送りたいんだけど...」と思ったら、Mailpitを起動するだけ。わざわざメールサーバーは要りません。