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

ローカル開発環境で、メール送信アプリのテストをする時
送信メールの確認をする方法を調べていて、 maildev に行きついた。

* [MailDev（本家） - Create better email during development](http://maildev.github.io/maildev/)
* 日本語記事では、以下を参考にした。
    * [maildev (SMTP mock server) を使ってハイパーメール開発 - Qiita](https://qiita.com/sotarok/items/ff5ca29f88d1f8069c98)
    * [ローカルに開発用メールサーバーを立ち上げる - Qiita](https://qiita.com/shogogg/items/6098fd2a4ee0291ec739)

これのdockerコンテナをバックグラウンドで起動して、
ローカルでアプリを確認すれば、実際のメールを送信せずに、安心してテストができるらしい。

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

```yml
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 ではできないこと](https://qiita.com/sotarok/items/ff5ca29f88d1f8069c98#maildev-%E3%81%A7%E3%81%AF%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8) にある通り、

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

ということらしい。
諦めきれずに他の記事を探していると、 [Mailparserでiso-2022-jpのメールを取り扱う場合 - Qiita](https://qiita.com/_takwat/items/924fc4d08cb8ecd76938) に

> [こちら](https://github.com/nodemailer/mailparser/issues/47) のやり取りやソースを見てもわかるのですが、iconvモジュールがない場合の保険(fallback)としてバンドルされているiconv-liteモジュールがISO-2022-JPを上手く取り扱えないのが原因のようで
>
> node\_modules/mailparser/node\_modules/encoding
>
> に移動して、npm install iconvして、ガチのiconvを使えるようにしてあげればこちらを使うようになるので上手く扱えるようになります
> node_modules/iconv があればそっちを読み込むのかな？

というのがあった。 nodemailer → mailparser の依存関係で、リポジトリも同じ。
だったら、 [djfarrelly/maildev](https://hub.docker.com/r/djfarrelly/maildev/) をコピーして、iconvを入れた新しいdockerイメージを作れば、ISO-2022-JP のメールも化けないのかな？
と思い、DockerFile をがんばって書いてみる。

* [本家のDockerFile](https://github.com/djfarrelly/MailDev/blob/master/Dockerfile) と、試行錯誤中に以下の記事も参考にした。
    * [node-iconvのインストールで若干詰まったメモ - Qiita](https://qiita.com/n0bisuke/items/194b729efcbe142c0c7a)
    * [Alpine Linux使ってみた - Qiita](https://qiita.com/tukiyo3/items/247f853c81bf00e82c11)

できた 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 をカレントに置いて、ローカルでビルドしてみる。

```bash
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](https://qiita.com/takeshi_hirosue/items/9cfd22c2263866cece99)

Dcocker Hubはこれ。 [kanemu/maildev-with-iconv - Docker Hub](https://hub.docker.com/r/kanemu/maildev-with-iconv/)

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

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

```yml
version: '2'

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

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