Edited at

ISO-2022-JP に対応した maildev の dockerイメージ を作る

More than 1 year has passed since last update.

ローカル開発環境で、メール送信アプリのテストをする時

送信メールの確認をする方法を調べていて、 maildev に行きついた。

これのdockerコンテナをバックグラウンドで起動して、

ローカルでアプリを確認すれば、実際のメールを送信せずに、安心してテストができるらしい。

docker-compose.yml に以下を書いて、docker-compose up -d する。

version: '2'

services:
maildev:
image: djfarrelly/maildev
ports:
- "1080:80"
- "3025:25" #テスト用SMTPポート

http://192.168.99.100:1080/ をブラウザで開けば、 MailDev の画面が開く。

docker-machine用仮想マシンのポートフォワーディングに 3025ポートを追加。

実際にアプリを起動して、登録メールを飛ばしてみる。

しばらく待つとMailDevにメールが表示されるが、 Display → Plain TEXT にはメールが表示されず、メールのタイトルも文字化けしてしまった。

上に紹介したQiitaの記事の maildev ではできないこと にある通り、



  • ISO-2022-JP メール (nodemailer が対応してない、もっというと nodemailer が依存してる liblime が依存してる iconv-lite が対応してない)


ということらしい。

諦めきれずに他の記事を探していると、 Mailparserでiso-2022-jpのメールを取り扱う場合 - Qiita


こちら のやり取りやソースを見てもわかるのですが、iconvモジュールがない場合の保険(fallback)としてバンドルされているiconv-liteモジュールがISO-2022-JPを上手く取り扱えないのが原因のようで

node_modules/mailparser/node_modules/encoding

に移動して、npm install iconvして、ガチのiconvを使えるようにしてあげればこちらを使うようになるので上手く扱えるようになります

node_modules/iconv があればそっちを読み込むのかな?


というのがあった。 nodemailer → mailparser の依存関係で、リポジトリも同じ。

だったら、 djfarrelly/maildev をコピーして、iconvを入れた新しいdockerイメージを作れば、ISO-2022-JP のメールも化けないのかな?

と思い、DockerFile をがんばって書いてみる。

できた DockerFile が以下。

FROM djfarrelly/maildev

RUN apk add --update \
gcc \
make \
g++ \
python \
&& rm -rf /var/cache/apk/*

WORKDIR /usr/src/app

ENV NODE_ENV production

RUN npm install node-gyp -g && \
npm install iconv --save && \
npm prune && \
npm cache clean \
rm -rf /tmp/*

DockerFile をカレントに置いて、ローカルでビルドしてみる。

docker build -t kanemu/maildev-with-iconv:1.0 .

docker run -p 1080:80 -p 3025:25 kanemu/maildev-with-iconv:1.0

これで、ちゃんと起動できた。

ISO-2022-JP のメールで文字化けもしなくなった。OK。

せっかくなので、勉強のつもりで Docker Hub にイメージを追加してみる。

以下を参考にした。

Docker HubでDockerfileを公開する(AUTOMATED BUILD) - Qiita

Dcocker Hubはこれ。 kanemu/maildev-with-iconv - Docker Hub

docker run -p 1080:80 -p 3025:25 kanemu/maildev-with-iconv

で普通に起動できるし、docker-compose.yml なら

version: '2'

services:
maildev:
image: kanemu/maildev-with-iconv
ports:
- "1080:80"
- "3025:25" #テスト用SMTPポート

で起動できるようになった。