【Docker】ISO-2022-JP対応のMailHogイメージの作り方

  • 2022年10月10日
  • 2022年10月10日
  • Docker

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

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG