TL;DR
コードだけ読んでいただければよろしいかと。
前置き
実はメールフォーム設置だけの案件を意外と多く請けます。なお現在のところPHP率100%です。
今まではローカルの環境構築に php -S
でローカルサーバー建てて mailcatcher に投げてテストしていて、正直これで十分だと思っていますしこれからもこれで行く気がします。軽いし。
しかしながらメイン業務であるフロントエンド開発では、基本としてDocker環境を活用した作業になることが多く、ローカル環境はこれからはDockerだな!というわけでミニマムなメールフォーム開発用コンテナを試し書きしてみたところです。
前置きおわり。
やってみた
ディレクトリ構成
/
├ php/
│ ├ php.ini
│ └ Dockerfile
├ html/
└ docker-compose.yml
想定するディレクトリ構成はこんな感じにしました。登場人物も少ないので割と自由に置いて良いと思います。
docker-compose.yml
version: "2"
services:
mailhog:
image: mailhog/mailhog
ports:
- 1025:1025
- 8025:8025
php:
image: php:7.4-apache
build: ./php
volumes:
- ./php/php.ini:/usr/local/etc/php/php.ini
- ./html:/var/www/html
ports:
- 8080:80
mailcatcher の代わりに MailHog を使います。
mailhog のポートは 1025
がSMTPで、8025
がWebメーラー閲覧用です。 http://localhost:8025
にアクセスすると mailcatcher の様にローカルのWebメーラーが見られます。その辺り詳しくは MailHogのREADME で。
php の Dockerfile
FROM php:7.4-apache
RUN curl -sSL https://github.com/mailhog/mhsendmail/releases/download/v0.2.0/mhsendmail_linux_amd64 -o mhsendmail \
&& chmod +x mhsendmail \
&& mv mhsendmail /usr/local/bin/mhsendmail
docker-compose.yml
の services.php.build
で設定されているビルド用のDockerfileの内容です。
php
から mailhog
宛にメールを送信するためにはその間を繋ぐ何かがなければいけません。そこで mailhog
から提供されている mhsendmail というツールに sendmail
に成り代わってもらい、間をつないでもらいます。上で行っているのは、その mhsendmail
の導入です。
php.ini
[Mail]
sendmail_path = "/usr/local/bin/mhsendmail --smtp-addr=mailhog:1025"
docker-compose.yml
の services.php.volumes
に記述した php.ini
の中身です。上で導入した mhsendmail
でメールを投げる設定を追記します。
この他にも php.ini
でphpの設定をいじりたいケースも出てくると思うので、このように php.ini
を volumes
で外から編集できるようにしておくのは良いと思います。
ビルドして起動してテスト
$ docker-compose up --build
html/index.php
などをこさえて送信テストをしてみましょう。 http://localhost:8080
でアクセスできるはずです。
<?php
var_dump(
mail(
'to@example.com',
'TEST MAIL',
'This is test mail',
'From: from@example.com'
)
);
http://localhost:8025
のWebメーラーで受信が確認できればOKです。
おしまい
これだけの事でDockerを使うのは正直リソースの無駄だと思うので、ミニマムな案件は php -S
と mailcatcher
で十分でしょう。だって軽いんだもの。
もっと大きな開発案件でメール送信をローカルで試験したい時には mailhog
の箇所だけ役立つかもしれません。