ローカルの開発環境にSMTPを整備する

## 概要
ローカル環境でアプリを開発している際、メール送信が必要な場合があります。
そういったメール送信を気軽に行えるような環境を作りたいので調べてみる。

**＜実現したいこと＞**

* PHPとSMTPは<font color="red">独立したコンテナ</font>で構成する
* PHPなどのプログラムからメールが送信できたか確認したい
* 外部へメールを送信して欲しくない
* ネットワークが繋がってないところでもテストできる
* 送信したメールが気軽に確認できる

## ファイル構成
dockerとdocker-composeを使い、optフォルダ内に下記のファイルを作成します。

```sh:ファイル構成
./opt
  ├ Dockerfile           # PHPコンテナ
  ├ docker-compose.yml
  ├ ssmtp.conf
  └ php.ini
```

## SMTPのコンテナ追加
「MailCatcher」で実現したいことをカバーできそうなので試してみる。

### docker-compose.yml追加

```yaml:docker-compose.yml
version: '2'
services:
 smtp:
  image: schickling/mailcatcher
  container_name: 'smtp'
  ports:
   - "1080:1080"
   - "1025:1025"
```

## PHPのコンテナ追加
独立したコンテナにするため、PHP-FPMを使います。

### Dockerfile作成
ssmtpを追加でインストールするため、公式コンテナを少しカスタマイズします。

```:Dockerfile
FROM php:5.6-fpm

# php options (ssmtp)
RUN apt-get -y update && apt-get install -y ssmtp mailutils
```

### php.ini作成
PHPの設定ファイルを作成します。

```:php.ini
[Date]
date.timezone = "Asia/Tokyo"

[Mail]
sendmail_path = "/usr/sbin/ssmtp -t"
```

### 設定ファイル作成
ssmtp.confファイルを作成します。
※ mailcatcher(<font color="red">1025ポート</font>)へ送信する

```:ssmtp.conf
#
# Config file for sSMTP sendmail
#
mailhub=smtp:1025
FromLineOverride=YES
```

### docker-compose.ymlに追加
buildで、上記DockerfileのPHPコンテナを作成して読み込みます。

```yaml:docker-compose.yml
version: '2'
services:
 smtp:
  image: schickling/mailcatcher
  container_name: 'smtp'
  ports:
   - "1080:1080"
   - "1025:1025"

 php:
  build: .
  container_name: 'php'
  ports:
   - '9000:9000'
  volumes:
   - ./php.ini:/usr/local/etc/php/php.ini
   - ./ssmtp.conf:/etc/ssmtp/ssmtp.conf
```

## コンテナ起動
docker-composeで各コンテナを起動する。

```sh:ターミナル
$ docker-compose up -d
```

正常に起動しているか確認してみる。

```sh:ターミナル
$ docker-compose ps
Name              Command               State                       Ports                      
----------------------------------------------------------------------------------------------
php    docker-php-entrypoint php-fpm    Up      0.0.0.0:9000->9000/tcp                         
smtp   mailcatcher --foreground - ...   Up      0.0.0.0:1025->1025/tcp, 0.0.0.0:1080->1080/tcp 
```

## メール送信テスト

### PHPコンテナへ接続
PHPを実行するため、PHPコンテナへ接続する。

```sh:ターミナル
$ docker exec -it php bash
root@86787e7bb563:/var/www/html#
```

### メール送信
PHPコマンドにてmail関数を実行してみる。

```sh:PHPコンテナ
root@86787e7bb563:/var/www/html# php -r "mail('hoge@example.com', 'My Subject', 'My Body');"
```

### メールの送信確認
mailCatcherのWebUIでメールを確認してみる。
※ <font color="red">1080ポート</font>へアクセス

![mailcatcher.png](https://qiita-image-store.s3.amazonaws.com/0/142279/514111ed-b652-d868-d34f-ec4640448058.png)

無事にメールが送信されているようです。

以上

## 参考サイト
* [MailCatcher](https://mailcatcher.me/)
* [MailCatcherでメール送信をテスト](https://qiita.com/pocari/items/de0436c39ffc65647cf0)
* [DockerHub - schickling/mailcatcher](https://hub.docker.com/r/schickling/mailcatcher/)
* [SMTPサーバ持ってないけど、メール送信機能が正常に動作してるか確認したい](https://qiita.com/shinofara/items/3ea9591f7bd2f0348227)
* [docker内のPHP(yii)からmailcatcherを使用する](https://qiita.com/tkyk0317/items/4de2f81466d1f1b0398c)
* [MailCatcher でメールの送受信をテストしよう](https://qiita.com/nanasess/items/8194ae76c1b94c9a7bb9)
* [メール回りのテストやデバッグには「MailCatcher」が便利ですぞ](http://tech.respect-pal.jp/mail_debug_with_mailcatcher/)
* [vagrant php環境　mailcatcherの設定　備忘録　（途中）](https://qiita.com/taiti/items/681f9a395323af1af62c)