Dockerでメール送信確認をする時に、sendmailの設定をしないといけなかったり、うまく外に出ていかなかったり面倒な場合がありますが、MailHogを使うと簡単にできます。
また、メールは実際には送信されないので、テストのつもりが間違ってメールを送ってしまった!という心配もないので安心です。
(PHPのアプリケーションでメール送信する場合について書きます。)
設定
MailHogを導入
MailHogをdocker-compose.yml
のサービスに追加します。
services:
mailhog:
image: mailhog/mailhog
ports:
- 8025:8025
アプリケーションの設定
1. PHPのmailをMailHogに変更する場合
フレームワークの設定(後述)で設定してもいいですが、ローカルと本番で設定を変えたくない等の場合や、素のPHPを使用する場合は、phpのメール送信コマンドをsendmail
からmhsendmail
に置き換えます。
まず、PHPアプリケーションのDockerfileでmhsendmail
のインストールを追加します。
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
phpの設定ファイルで、sendmail_path
をmhsendmail
にします。
php.ini
に直接書いてもいいですが、mail.ini
というファイルを作って/etc/php.d/mail.ini
へ設置することにします。
[mail function]
sendmail_path = "/usr/local/bin/mhsendmail --smtp-addr=mailhog:1025"
services:
php:
volumes:
- ./mail.ini:/etc/php.d/mail.ini:ro
(その他の必要な設定は適宜記述してください。)
2. フレームワークの設定で設定する場合
mhsendmail
を使用せずに、フレームワークの設定でMailHogを使います。
Laravelの場合
.env
にMailHogの設定を書きます。
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_FROM_ADDRESS=test@example.com
CakePHPの場合
app/Config/email.php.default
をコピーして、 app/Config/email.php
にMailHogの設定を書きます。
public $default = array(
'transport' => 'Smtp',
'from' => 'test@example.com',
'host' => 'mailhog',
'port' => 1025,
'timeout' => 30,
);
※ローカルと本番等で切り替える必要がある場合は、適宜書き分けてください。
メールの確認
ブラウザで http://localhost:8025/ を開くと、送信されたメールが確認できます。
Dockerを停止すると消えてしまうので、残しておく必要がある場合は、volumeを設定するといいようです。