SOFTELメモ

</> 技術者募集

【php】mail関数でメールを送らないでファイルに書き出させる

問題

開発やテストのときに、宛先を間違ってメールを送りたくないけど、メールの内容は確認したいし…

どうするのが良い?

答え

phpのmail関数、mb_send_mail関数は、内部的にはsendmailコマンドを使ってメールを送っています(Linuxでは)。

phpinfo() の sendmail_path に「/usr/sbin/sendmail -t -i」などが設定されています。

php.ini sendmail_path

変更可能な設定項目で、php.ini などで変更してしまえば、メールを送る以外のことをさせることができるということでもあります。

以下のように変更すると、固定のファイルに直近で送ったメールの内容を書き出してくれます。

; いつもはsendmailコマンドの標準入力に渡しているメールの内容を
; catコマンドに渡して、ファイルに出力する
sendmail_path =/bin/cat > /tmp/mail.log

以下のようにすれば、1つのファイルにですが、追記追記で送ったメールをすべて書き出せます。

sendmail_path =/bin/cat >> /tmp/mail.log

さらに1メール1ファイルにして、メールソフトで内容も確認できるようにするには、例えば以下のようにするとよいです。
(mktempコマンドで作った一時ファイルに出力していく。出力先は -p で変更可能。ファイル名のルールも変更可能。)

sendmail_path =/bin/cat > `mktemp -p /tmp mail.XXXXXXXX.eml`

phpでメールを送ってみると

php -r "mb_send_mail('test@example.com', 'テストメールの件名', 'メールの本文。メールの本文。メールの本文。', 'From: foo@example.com');"

こうなり、

$ ls -1 /tmp/mail.*.eml
/tmp/mail.0yHu4c63.eml
/tmp/mail.5YAZGiL2.eml
/tmp/mail.cnYE1v5V.eml
/tmp/mail.l8G9nALr.eml
/tmp/mail.pLcdKv7e.eml

ファイルをメールソフトで開くと内容も確認できる。

sendmail_path test

メルマガ送信のテストや、システムなどからの自動的なメール送信の検証などに、実際にメールとして送信しなくても動作が確認できてよいでしょう。

関連するメモ

コメント