ローカル開発環境で、メール送信アプリのテストをする時
送信メールの確認をする方法を調べていて、 maildev に行きついた。
- MailDev(本家) - Create better email during development
- 日本語記事では、以下を参考にした。
これの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 と、試行錯誤中に以下の記事も参考にした。
できた 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ポート
で起動できるようになった。