docker内のPHP(yii)からmailcatcherを使用する

## はじめに

職場で現在開発しているプロジェクトの開発環境はdockerを使用しており、「Laravel＋nginx＋mariadb＋mailcatcher」の構成で開発しています。
しかし、古いプロジェクトではdockerを用いて開発しておらず、共有サーバー（テストサーバー）で開発を行っていました。
そこで、ちょこちょこ出てくる機能追加や不具合対応などを効率よく実施する為、一部のプロジェクトをdockerへ移行しました。
その際、mailcatcherの設定で少し手間取ったので、メモを取りたいと思います。

## mailcatcherとは？

シンプルなSMTPサーバーで、特に設定はしなくても起動するだけでメール送信機能がテストできるものです。
以下のような特徴があり、かなり便利です！

- テスト用のSMTPサーバーとして利用
    - postfix等のSMTPサーバーを容易しなくてもよい（簡単に構築可能）
- mailcatcherに送信したメールをブラウザ上で確認可能（デフォルトポートは、1080）
- 外部へメールを送信しない

## 古いプロジェクトの構成
- PHP 5.6.31
- Yii Framework 2.0
- Apache 2.2.29
- MySQL 5.5.14

## プロジェクトのdocker移行

docker-composeを利用し、「PHP(Apache)＋MySQL＋PhpMyAdmin＋mailcather」の構成で環境を構築します。
yiiが動作しているコンテナ内で、mailcatcherをインストールし使用できるようにしています。
なお、ポートやマウントするディレクトリなどは、任意で設定してください。
※ 個別のDocerkfileは割愛します

```yaml:docker-compose.yml
version: '2'
services:
  smtp:
    image: schickling/mailcatcher
    ports:
      - "1080:1080"
      - "1025:1025"
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
      - mysql
    ports:
      - "2222:80"
    environment:
      PMA_ARBITRARY: 1
      PMA_HOST: [MySQLホスト]
      PMA_USER: [MySQLユーザー名]
      PMA_PASSWORD: [MySQLユーザーパスワード]
  mysql:
    build: ./mysql
    environment:
      MYSQL_ROOT_PASSWORD: [ルートパスワード]
      MYSQL_DATABASE: [データベース名]
      MYSQL_USER: [MySQLユーザー名]
      MYSQL_PASSWORD: [MySQLユーザーパスワード]
    volumes:
      - ./mysql/data:/var/lib/mysql
  php:
    build: ./php
    ports:
      - '1234:80'
    volumes:
      - ./web/html:/var/www/html
      - ./web/yii:/var/www/yii
    depends_on:
      - mysql
```

```:Dockerfile
ROM php:5.6.31-apache

RUN apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng12-dev libmcrypt-dev && \
    docker-php-ext-install pdo_mysql mysqli mbstring gd iconv mcrypt
RUN cd /etc/apache2/mods-enabled && ln -s ../mods-available/rewrite.load
RUN apt-get install -y vim less wget
RUN apt-get install -y ruby ruby-dev rubygems
RUN apt-get install -y libsqlite3-dev
RUN gem install mailcatcher

ADD ./php.ini /usr/local/etc/php/php.ini
```

## mailcatcher設定

Laravelでは、「.env」ファイルにmailcatcherが起動しているサーバーやポート等を記載するだけで動作したのですが、
古いプロジェクトではYiiが提供しているメール機能を使用しておらず（何故かはわからない）、PHPが提供している「mail関数」を使用してメールを送信しています。

そこで、PHPからmailcatcherへメール送信できるよう、php.iniファイルに以下の設定を追加します。
はじめは、以下のようにmailcatcherが動作しているdockerの情報を記載していたのですが、エラーメッセージが出力され動作しませんでした。


```ini:php.ini
[mail function]
SMTP = smtp
smtp_port = 1025
```

```text:エラーメッセージ
sh: 1: -t: not found
```

これは、php.iniの「sendmail_path」が正常に設定されていないことを示すエラーメッセージなので、sendmail_pathの設定を追加しました。

```ini:php.ini
[mail function]
SMTP = smtp
smtp_port = 1025
sendmail_path = /usr/bin/env catchmail
```

これでも動作せず、以下の設定に変更することにより、正常にメールが送信されるようになりました。

```ini:php.ini
[mail function]
sendmail_path = /usr/bin/env catchmail --smtp-ip smtp --smtp-port 1025
```

## まとめ

mailcatcherは、さくっとメール機能の確認ができるので非常に便利です！
それにしても、Laravelの開発環境ではmailcatcherをLaravelのコンテナにインストールしなくてもメール送信が実現できているのですが、
今回の場合は何故、Yiiを動かしているコンテナにmailcatcherをインストールしないと動作しないのか、疑問です。
(メール送信部分でYiiの機能を使用するようにすれば、Laravelのようにメール送信機能がじつげんできるのかな？）

## 参考サイトなど
- [MailCatcher](https://mailcatcher.me/)
- [sh: 1: -t not found](http://axiac.ro/blog/sh-1-t-not-found/)
- [docker-compose](http://docs.docker.jp/compose/toc.html)