MailHog は Docker でよく使われているメール送信テスト用サーバーです。送信サーバーに MailHog を指定すると実際にはメールが飛ばず、飛んだ体のメールの中身が MailHog 内から見れるという感じです。
mailhog/mailhog – Docker Image | Docker Hub
mailhog/MailHog: Web and API based SMTP testing
MailHog は便利なのですが、ISO-2022-JP形式のメールの閲覧時に文字化けするという問題があります。これは例えば次の様に起きます。
件名に”件名”、本文に”日本語”としたメールを送信したところ上記の画像の通りに文字化けしました。ヘッダーも形式に対応していないためテンプレートがそのまま出力されています。
ISO-2022-JP は表現できる文字種こそ UTF-8 に劣るものの古いメーラーでも問題なく読めるため使用されるタイミングがあります。特に不特定多数の方々を相手とするサービスでは ISO-2022-JP の方が無難です。UTF-8 ならメーラーによってはまったく読めないのに対し、ISO-2022-JP なら㈱や髙の様な一部文字が欠けるだけで済みます。ISO-2022-JP でも MailHog を使いたくなります。
この問題の解決策として Python を用いた ISO-2022-JP 対応の MailHog を作成された方が既にいます。
PyMailHog メール送信テスト用サーバー – Symfoware
symfo / pymailhog — Bitbucket
Bitbucket から一式ダウンロードして次の様に python で動かすのが使い方です。
python PyMailHog
動かしてメールを送ると次の様に ISO-2022-JP のメールでも日本語として読める文字列を表示してくれます。
これを mailhog 同様に Dokcer で使用できる様にします。これは次の Dockerfile と実行構成ないしコマンドでできます。
# # ISO-2022-JP 対応の MailHog の Dockerfile # @see https://bitbucket.org/symfo/pymailhog/src/master/ # # Python をベースイメージとして指定 # Linux として複雑なことはしないので軽量なディストリである alpine を選択 FROM python:3.10.7-alpine3.16 # ISO-2022-JP 対応である PyMailHog をクローン RUN apk --no-cache add --virtual build-dependencies \ git \ && git clone https://bitbucket.org/symfo/pymailhog.git \ && apk del build-dependencies \ # mailhog/MailHog にあるパーミッション周りのワークアラウンドを引用。消さない方が無難そう # @see https://github.com/mailhog/MailHog/blob/e6fa06877ef61ea82bbef234d94bdc75cca478d1/Dockerfile#L18 # # Add mailhog user/group with uid/gid 1000. # This is a workaround for boot2docker issue #581, see # https://github.com/boot2docker/boot2docker/issues/581 && adduser -D -u 1000 mailhog # 追加ユーザーである mailhog を実行ユーザーとして指定 USER mailhog # クローンした PyMailHog をカレントディレクトリに指定 WORKDIR /pymailhog # この Dockerfile から生成されるイメージを単に実行するのみで # PyMailHog が動くようにエントリーポイントを設定 ENTRYPOINT ["python", "PyMailHog"] # メールを送る用のSMTPポート # 送られた体のメールを見るためのHTTPポート # で通信を待ち受けすると指定 EXPOSE 1025 8025
# docker-compose 用の構成 # docker-compose.yml version: "3" services: mailhog: build: # 上述した Dockerfile が置いてあるディレクトリを指定 context: ./docker/mailhog ports: # 送られたメールを公開するための HTTP の方のみマウント - target: 8025 published: 8025 protocol: tcp mode: host
# 実行コマンド # あらかじめ docker build -t pymailhog docker/mailhog で # pymailhog というタグの PyMailHog の使えるイメージを生成しておく docker run --rm -p 1025:1025 -p 8025:8025 pymailhog
この様にして ISO-2022-JP 対応の MailHog を Docker 上で動かせます。こうすると一々 MailHog 上から eml ファイルをダウンロードして ISO-2022-JP 対応のメーラーで開くようなことをしなくてよくなり楽になります。