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 対応のメーラーで開くようなことをしなくてよくなり楽になります。


