mailcatcher

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

More than 1 year has passed since last update.

概要

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

<実現したいこと>

  • 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ポートへアクセス

mailcatcher.png

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

以上

参考サイト