117
125

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ローカルテスト用SMTPメールサーバは Mailpit がオススメ!

Last updated at Posted at 2024-09-30

はじめに

長らくローカルテスト用のメールサーバとして MailHog (DockerHub) を使ってきたのですが、以下のような不満がありました。

  • 今現在(2024)メンテナンスが行われていない
  • ローカル開発用とはいえ、UXが厳しい(日本語を受け付けてくれない)
  • アーキテクチャが amd64 しか対応していない

そこで、MailHogよりベターな選択肢はないか調査してみたところ、 Mailpit (DockerHub) が以下の点で良いと感じ実際に使っているので、この記事で紹介します。

  • 今現在(2024)メンテナンスが行われている
  • 良いUX。ちゃんと日本語でメールを検索できる
  • アーキテクチャとして arm にも対応している (amd64/arm64/i386)
  • ほか好ましい点
    • サーバ再起動後にちゃんとデータが残る (sqlite形式で残るようです)
    • Goで実装されていて動作が軽い
      • Goなのでシングルバイナリとしても動作できる
      • いざとなったら自分で改造するのも簡単!
    • REST APIでメールを検索できる
    • リアルタイムで通知が分かる
    • その他豊富な機能

Mailpit を使ってみる

Docker Compose で立ち上げる

以下の compose.yml で立ち上げることができます。設定ファイルは一切不要です。データ(sqlite形式のDBファイル)は ./mailpit 以下に保存されるようになっています。

compose.yml
services:
  mail:
    # Web画面: http://localhost:19980
    image: axllent/mailpit:latest
    ports:
      - "19925:1025"
      - "19980:8025"
    volumes:
      - ./mailpit:/data
    environment:
      TZ: Asia/Tokyo
      MP_MAX_MESSAGES: 5000
      MP_DATABASE: /data/mailpit.db
      MP_SMTP_AUTH_ACCEPT_ANY: 1
      MP_SMTP_AUTH_ALLOW_INSECURE: 1
$ docker compose up -d

SMTPポートは localhost:19925 に、Web画面は http://localhost:19980 に開いています。

image.png

なお、Web画面はレスポンシブ対応のようです。

メールを試しに送信してみる

立ち上げたMailpit宛にPython3でテストメールを送信してみます。

send_mail.py
#!/usr/bin/env python3

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

smtp_server = "localhost"
smtp_port = 19925

from_email = "sender@example.com"
from_name = "Sender Name"
to_email = "recipient@example.com"
to_name = "Recipient Name"

subject = "テストメール"
body = "これはテストメールです。"

# メールのメッセージを作成
msg = MIMEText(body, "plain", "utf-8")
msg["From"] = formataddr((from_name, from_email))
msg["To"] = formataddr((to_name, to_email))
msg["Subject"] = subject

# SMTPサーバーに接続してメールを送信
try:
    with smtplib.SMTP(smtp_server, smtp_port) as server:
        server.sendmail(from_email, [to_email], msg.as_string())
    print("メールが送信されました")
except Exception as e:
    print(f"メールの送信に失敗しました: {e}")

image.png

image.png

メールが届くと、リアルタイムにブラウザのアイコンに反映されました。

image.png

また、画面左下のベルのマークを押下してプッシュ通知を有効にすることにより、プッシュ通知を受け取ることもできました。

image.png

API を使って送信したメールを検索してみる

E2E試験や統合試験などで、アプリケーションが特定のメールを送ったことを自動テストしたいことがあると思いますが、そういったケースに使えるかチェックしてみます。

MailpitはそういったケースのためにREST APIを備えており、http://Web画面のアドレス/api/v1/ 以下でREST APIドキュメントにアクセスすることができます。

今回のセットアップであれば http://localhost:19980/api/v1/ でAPIドキュメント、もともとのSwagger定義を http://localhost:19980/api/v1/swagger.json で取得することができます。

image.png

API操作に対応するcurlコマンドを確認できるほか、直接ドキュメント上からAPIを実行することも可能です。

実際にcurlコマンドを実行してみます。

curlコマンドを実行して検索APIを叩いてみる
# ?query=これはテストメールです
$ curl -X GET "http://localhost:19980/api/v1/search?query=%E3%81%93%E3%82%8C%E3%81%AF%E3%83%86%E3%82%B9%E3%83%88%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%99" \
 -H "accept: application/json" | jq

{
  "total": 1,
  "unread": 0,
  "count": 1,
  "messages_count": 1,
  "start": 0,
  "tags": [],
  "messages": [
    {
      "ID": "VDxtyh9qXyGpPAkFddZMED",
      "MessageID": "HibCLGXnV53UDUCPg3tjfn@mailpit",
      "Read": true,
      "From": {
        "Name": "Sender Name",
        "Address": "sender@example.com"
      },
      "To": [
        {
          "Name": "Recipient Name",
          "Address": "recipient@example.com"
        }
      ],
      "Cc": [],
      "Bcc": [],
      "ReplyTo": [],
      "Subject": "テストメール",
      "Created": "2024-09-25T18:58:11.93+09:00",
      "Tags": [],
      "Size": 551,
      "Attachments": 0,
      "Snippet": "これはテストメールです。"
    }
  ]
}

先ほど送信したメールを含むJSONが取れました!

まとめ

同ジャンルのローカルテスト用のSMTPサーバは検索すればかなりあるのですが、動作が軽い・マルチアーキテクチャ・求めている機能(UX・REST API・データ永続性)を満たしているという点で Mailpitは文句のつけようがない完成度 と感じました。

テスト用のSMTPサーバとしてMailpitは非常におすすめです。

117
125
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
117
125

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?