P-SQUARE MIDI Site RSSフィード

2014/01/08 (Wed)

[] phpからメール送信したいが、mail()関数を使っても何もおこらない  phpからメール送信したいが、mail()関数を使っても何もおこらないを含むブックマーク

RedhatCentOSなどでWeb専用サーバをたてた場合に陥りやすい罠。今後のためにメモ。

なお以下環境を前提に記述します。


  • phppostfixなどをrpmで導入済み
  • メールサーバは別サーバとして存在する
  • このサーバのpostfixは何も設定していない、かつ起動していない
  • このサーバのDNS設定は正しく完了している


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などのラッパープログラムがある場合があるので、そちらを使うのが良いかと思います。
トラックバック - http://d.hatena.ne.jp/psquare/20140108/p1