概要
ローカル環境でアプリを開発している際、メール送信が必要な場合があります。
そういったメール送信を気軽に行えるような環境を作りたいので調べてみる。
<実現したいこと>
- PHPとSMTPは独立したコンテナで構成する
- PHPなどのプログラムからメールが送信できたか確認したい
- 外部へメールを送信して欲しくない
- ネットワークが繋がってないところでもテストできる
- 送信したメールが気軽に確認できる
ファイル構成
dockerとdocker-composeを使い、optフォルダ内に下記のファイルを作成します。
ファイル構成
./opt
├ Dockerfile # PHPコンテナ
├ docker-compose.yml
├ ssmtp.conf
└ php.ini
SMTPのコンテナ追加
「MailCatcher」で実現したいことをカバーできそうなので試してみる。
docker-compose.yml追加
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(1025ポート)へ送信する
ssmtp.conf
#
# Config file for sSMTP sendmail
#
mailhub=smtp:1025
FromLineOverride=YES
docker-compose.ymlに追加
buildで、上記DockerfileのPHPコンテナを作成して読み込みます。
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で各コンテナを起動する。
ターミナル
$ docker-compose up -d
正常に起動しているか確認してみる。
ターミナル
$ 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コンテナへ接続する。
ターミナル
$ docker exec -it php bash
root@86787e7bb563:/var/www/html#
メール送信
PHPコマンドにてmail関数を実行してみる。
PHPコンテナ
root@86787e7bb563:/var/www/html# php -r "mail('hoge@example.com', 'My Subject', 'My Body');"
メールの送信確認
mailCatcherのWebUIでメールを確認してみる。
※ 1080ポートへアクセス
無事にメールが送信されているようです。
以上