Loading ...

mail()でメールが送信できるかどうかの確認手順


mail()がそもそも実行できるか?

PHP CGI SAPIやPHP CLI SAPIで下記のようにコマンドを実行すれば,mail()が内部で作成しているメッセージテキストを標準出力に出力することができます.

$ echo '<?php mail( "foo@example.com", "test", "body", "From: bar@example.com"); ?>' |
  php -d sendmail_path="cat -" (2行を続けて書いて実行します)

mail()は内部でsendmailコマンドを起動しています.これを入力を標準入力にしたcatに変更する(-dオプション)ことで標準出力にヘッダー+本文のメッセージ全体を表示することが出来るようになります.

下記は出力例です.

To: foo@example.com
Subject: test
From: bar@example.com

body

mail()がそもそも実行できない

PHPのビルドされた環境により,作成されたPHPでmail()が使用できない場合があります. mail()が使用できないPHPが作成される条件として,ビルド時に/usr/sbin/sendmail,/usr/lib/sendmailがなければmail()が使えないPHPがビルドされます*1

mail()とsendmailコマンドの切り分け

mail()は最終的には内部でphp.iniのsendmail_pathの値と等価のコマンドラインでコマンドを実行します. デフォルトでは「/usr/sbin/sendmail -t -i」なので,下記のようにすることとほぼ等価です.

$ /usr/sbin/sendmail -t -i <第5引数を指定した場合,それがここに来る>
To: <第1引数>
Subject: <第2引数>
<第4引数>

第3引数

上記のようにコマンドを入力,メッセージを作成し,[Ctrl][D]で終了させるとコマンドsendmailは(正常に設定されていれば)内部queueにメールを蓄積し,メールを送信します. つまり,

  • このコマンドでメールが送信されているのにmail()でメールが送信されない場合,mail()が無効になっている,あるいはmail()の使いかたがを間違えている.
  • このコマンドでメールが送信されない場合,sendmailやPostfixなどのMTA*2が正しく設定されていない
  • ファイアウォールやスマートリレー,SMTP認証などを使用しないとメールが送信できない(MTAの設定)

などが考えられます. もしメールのqueueに溜まっているならroot権限があればmailqコマンドでqueueの状態が確認できるので,実行して確認してもいいでしょう.



*1 例えばTurbolinux 10 Serverの初期状態のPHPはmail()が無効のようです(アップデートで解決します)
*2 のMSA部分
リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
最終修正日時: Sun, 19 Mar 2006 22:11:14 JST (1451d)
文字数(HTML): 1385
文字数(Wiki): 1360
人気ブログランキング - よくきた wiki