2014/01/08 (Wed)
■[仕事] phpからメール送信したいが、mail()関数を使っても何もおこらない

RedhatやCentOSなどでWeb専用サーバをたてた場合に陥りやすい罠。今後のためにメモ。
なお以下環境を前提に記述します。
phpコード
<?php $to='username@domain.com'; <-- 宛先アドレス $subject='TEST MAIL'; $body='THIS IS TEST'; echo mail($to,$subject,$body); ?>
なおコマンドラインで実行するには以下です。
$ php -f mailtest.php
結果はまぁふつうに「1」が返ると思います。これは「正しく配送された」ではなく「コマンドが無事終了した」という事です。
ポイント1:php.iniに記述があるか
/etc/php.ini 内にて以下記述確認します。
sendmail_path = /usr/sbin/sendmail -t -i
rpmで導入済みならばあるはず。なければ追加。
なおそのファイルがある事も確認すること。
ちなみに「あれ?sendmailじゃなくてpostfixじゃない?」と思われるかもしれませんが、alternativesにより正しくリンクされているので問題ありません。
ポイント2:コマンドラインでメール送信できるか
mail()関数は内部的に「ポイント1」で指定されたコマンドを呼び出しているだけっぽい。であれば以下コマンドを入力して正しく配送されるか確認する。
$ /usr/sbin/sendmail -t -i To: username@domain.com Subject: TEST MAIL THIS IS TEST . ^D
最後の「^D」は「Ctrl」+「D」です。その前のピリオドは無くてもいいかも。
これでメール配送されたか確認。
配送された場合は「ポイント1」が間違っている(php固有の問題)か、「phpコード」記述に間違いがあるかです。
配送されなかった(何もおこらなかった)場合は「ポイント3」へ。
ポイント3:メールサーバの設定
まずは以下確認。
$ su - # ls -l /var/spool/postfix/maildrop
アルファベットや数字だけで構成されたファイルがあり、それの日付が「ポイント2」でテストした時刻じゃありませんか?
この場合ローカルサーバのpostfixの設定が必要です。
postfixの設定となると、スパム・リレー対策など凄く面倒なイメージがありますが、今回の場合は「このサーバからは送信のみ」いわゆる「Nullクライアント」と言うものなので、設定は単純です。
# cd /etc/postfix # vi main.cf
このファイルの以下部分変更してください。
myhostname = webserver.domain.com <--- このサーバのFQDNです mydomain = domain.com inet_interfaces = localhost <--- 初期値のはずですが確認 relayhost = $mydomain
これで配送できるようになりますが、まずはpostfixを常時起動するか確認します。
# chkconfig --list postfix postfix 0:off 1:off 2:off 3:off 4:off 5:off 6:off
この状態だと次回サーバ再起動時などに自動起動しないので以下実行します。
# chkconfig postfix on
その上でpostfixを起動します。
が、その前に。
ここで起動すると、/var/spool/postfix/maildropにキューされていたメールが一斉に配送されます。
結構たくさんのメールがありませんでしたか?(自分の環境ではcronが自動送信したメールが大量にあった)
それら要らないならファイルベールで消しちゃいましょう(削除は自己責任で慎重に!)。
よけれは以下。
# /etc/init.d/postfix start
これで改めて冒頭のphpコードを実行してみましょう。今度は配送されたはずです。
それでもダメな場合
- このコマンドは特定のメールサーバを直接指定するのではなく、DNSのMXレコードの定義に従って接続するようです。よって自サーバのDNS設定からnslookup等で対象のドメインへのメール配送経路が確立されているか確認しましょう。
- 自サーバからの接続がMXで指定された配送先サーバから拒否されていないか、メールサーバ管理者に確認しましょう。
- From:アドレスなど正しく定義しないと配送拒否される可能性あります。メールサーバ管理者に確認しましょう。
- なおWindows版のphpではメールサーバの25番ポートを直接叩くらしいです(未確認)。
- またWindows版xamppではsendmail.exeなどのラッパープログラムがある場合があるので、そちらを使うのが良いかと思います。
- 25282 https://www.google.co.jp/
- 2956 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=8&ved=0CF4QFjAH&url=http://d.hatena.ne.jp/psquare/20070807/p1&ei=IeLMUrneEY3jkAWq8oD4Dw&usg=AFQjCNFYlU8dFIbmqryF8EHrRLi88QI9Gw
- 2930 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCsQFjAA&url=http://d.hatena.ne.jp/psquare/20130523/p1&ei=sOjMUr2CPY3UkQXZ8oGoCQ&usg=AFQjCNFVXGtCxGe1ZtK0fbO2XHsgEq_qJg&bvm=bv.58187178,d.dGI
- 1830 https://www.google.co.jp
- 1523 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CDAQFjAB&url=http://d.hatena.ne.jp/psquare/20090817/p1&ei=Ye3MUv3HDYbDkAWguYDgBA&usg=AFQjCNF-7NSeEX0vs91yd3-OnNngRhrHUQ&bvm=bv.58187178,d.dGI
- 865 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0CEUQFjAC&url=http://d.hatena.ne.jp/psquare/20090817/p1&ei=UAjNUq-eJIv5lAWs94H4AQ&usg=AFQjCNF-7NSeEX0vs91yd3-OnNngRhrHUQ
- 711 https://www.google.com/
- 685 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&ved=0CEYQFjAD&url=http://d.hatena.ne.jp/psquare/20100330/p1&ei=8BjNUuuzBoWZlAX654HYDA&usg=AFQjCNEScCrEZ279yMW0gjvJxNZY1ENIMw&bvm=bv.58187178,d.dGI
- 493 http://search.yahoo.co.jp/
- 483 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&cad=rja&ved=0CFAQFjAE&url=http://d.hatena.ne.jp/psquare/20050414/p5&ei=W_rPUv-ZCsqxlAX44IGYCg&usg=AFQjCNHR7n3Pfv2SCYFogKdk4NgPjtZX7w&sig2=a1XRhixrk7xfmANw9z6nxg&bvm=bv.59026428,d