この回答には、mail()
関数自体の使用にのみ適用される部分がありますが、これらのトラブルシューティング手順の多くは、任意のPHPメールシステムに適用できます。
スクリプトがメールを送信していないように見える理由はさまざまです。明白な構文エラーがない限り、これらを診断することは困難です。1つがなければ、以下のチェックリストを実行して、発生する可能性のある潜在的な落とし穴を見つける必要があります。
エラー報告が有効になっており、すべてのエラーを報告するように設定されていることを確認してください
エラー報告は、コードのバグやPHPで発生する一般的なエラーを根絶するために不可欠です。これらのエラーを受信するには、エラー報告を有効にする必要があります。次のコードをPHPファイルの先頭(またはマスター構成ファイル)に配置すると、エラーレポートが有効になります。
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
PHPで有用なエラーメッセージを取得するにはどうすればよいですか?— この詳細については、この回答。
mail()
関数が呼び出されていることを確認してください
ばかげているように見えるかもしれませんが、一般的なエラーは、実際にmail()
関数をコードに配置することを忘れることです。そこにあり、コメント化されていないことを確認してください。
mail()
関数が正しく呼び出されていることを確認してください
bool mail(string $ to、string $ subject、string $ message [、string $ additional_headers [、string $ additional_parameters]])
mail関数は、3つの必須パラメーターと、オプションで4番目と5番目のパラメーターを取ります。への呼び出しにmail()
3つ以上のパラメータがない場合、失敗します。
への呼び出しにmail()
正しいパラメーターが正しい順序で含まれていない場合も失敗します。
サーバーのメールログを確認する
Webサーバーは、それを介して電子メールを送信するすべての試みをログに記録する必要があります。これらのログの場所はさまざまです(サーバーの管理者にログの場所を尋ねる必要がある場合があります)が、通常はの下のユーザーのルートディレクトリにありlogs
ます。内部には、メール送信の試行に関連してサーバーから報告されたエラーメッセージがあります。
ポート接続の失敗を確認する
ポートブロックは、ほとんどの開発者がコードを統合してSMTPを使用して電子メールを配信するときに直面する非常に一般的な問題です。また、これはサーバーのメールログで簡単に追跡できます(メールログのサーバーの場所は、上で説明したように、サーバーによって異なります)。共有ホスティングサーバーを使用している場合、ポート25および587はデフォルトでブロックされたままになります。このブロックは、ホスティングプロバイダーによって意図的に行われます。これは、一部の専用サーバーにも当てはまります。これらのポートがブロックされている場合は、ポート2525を使用して接続を試みます。そのポートもブロックされている場合は、ホスティングプロバイダーに連絡してこれらのポートのブロックを解除することが唯一の解決策です。
ほとんどのホスティングプロバイダーは、これらのメールポートをブロックして、スパムメールの送信からネットワークを保護します。
プレーン/ TLS接続にはポート25または587を、SSL接続にはポート465を使用します。ほとんどのユーザーの場合、一部のホスティングプロバイダーによって設定されたレート制限を回避するために、ポート587を使用することをお勧めします。
エラー抑制演算子を使用しない
ときにエラー抑制演算子は、 @
PHPでの式の前に付加され、その式により生成される可能性があるすべてのエラーメッセージは無視されます。この演算子の使用が必要な状況がありますが、メールの送信はそれらの1つではありません。
コードに含まれている場合、@mail(...)
これをデバッグするのに役立つ重要なエラーメッセージを非表示にしている可能性があります。を削除し、@
エラーが報告されていないか確認します。
後で具体的なエラーを確認するerror_get_last()
場合にのみお勧めします。
mail()
戻り値を確認する
mail()
機能:
TRUE
メールの配信が正常に受け入れられた場合は戻り、FALSE
それ以外の場合は戻ります。メールが配信用に受け入れられたからといって、メールが実際に目的の宛先に届くわけではないことに注意することが重要です。
これは、次の理由で注意することが重要です。
FALSE
戻り値を受け取った場合、エラーはメールを受け入れるサーバーにあることがわかります。これはおそらくコーディングの問題ではなく、サーバー構成の問題です。これが発生している理由を調べるには、システム管理者に相談する必要があります。
TRUE
戻り値を受け取っても、メールが確実に送信されるわけではありません。これは、PHPによってサーバー上の対応するハンドラーに電子メールが正常に送信されたことを意味します。PHPの制御外に、電子メールが送信されない原因となる可能性のある、さらに多くの障害点があります。
だから、FALSE
一方で正しい方向にあなたを指して助けるTRUE
んではない必ずしもあなたの電子メールが正常に送信された意味。これは重要です!
ホスティングプロバイダーがメールの送信を許可し、メールの送信を制限していないことを確認してください
多くの共有ウェブホスト、特に無料のウェブホスティングプロバイダーは、サーバーからのメール送信を許可しないか、特定の期間中に送信できる量を制限しています。これは、スパマーが安価なサービスを利用するのを制限しようとする彼らの努力によるものです。
ホストにメール制限があるか、メールの送信がブロックされていると思われる場合は、ホストのFAQをチェックして、そのような制限がリストされているかどうかを確認してください。それ以外の場合は、メールの送信に制限があるかどうかを確認するために、サポートに連絡する必要がある場合があります。
スパムフォルダを確認してください。電子メールがスパムとしてフラグされるのを防ぐ
多くの場合、さまざまな理由により、PHP(およびその他のサーバー側プログラミング言語)を介して送信された電子メールは、最終的に受信者のスパムフォルダーに保管されます。コードのトラブルシューティングを行う前に必ず確認してください。
PHP経由で送信されたメールが受信者の迷惑メールフォルダーに送信されないようにするには、PHPコード内でも、メールに迷惑メールとしてマークされる可能性を最小限にするためにも、さまざまな方法があります。Michiel de Mareからの良いヒントは次のとおりです。
- メールとドメイン名が同じであることを証明し、ドメイン名のなりすましを防ぐには、SPFやDKIMなどのメール認証方法を使用します。SPF Webサイトには、サイトのDNS情報を生成するためのウィザードが含まれています。
- 逆引きDNSをチェックして、メールサーバーのIPアドレスがメールの送信に使用するドメイン名を指していることを確認します。
- 使用しているIPアドレスがブラックリストに含まれていないことを確認してください
- 返信先アドレスが有効な既存のアドレスであることを確認してください。
- 宛先フィールドには、電子メールアドレスだけではなく、完全な実名の宛先を使用します(例:)
"John Smith" <john@blacksmiths-international.com>
。
- abuse@yourdomain.comやpostmaster@yourdomain.comなどの不正使用アカウントを監視します。つまり、これらのアカウントが存在することを確認し、送信されたものを読んで、苦情に対応します。
- 最後に、登録解除を本当に簡単にします。そうしないと、ユーザーはスパムボタンを押して購読を解除し、評判に影響を与えます。
プログラムで送信するメールが自動的にスパムとしてマークされないようにするにはどうすればよいですかをご覧ください。このトピックの詳細については。
すべてのメールヘッダーが提供されていることを確認してください
「From」や「Reply-to」などの一般的なヘッダーがない場合、一部のスパムソフトウェアはメールを拒否します。
$headers = array("From: from@example.com",
"Reply-To: replyto@example.com",
"X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);
メールヘッダーに構文エラーがないことを確認する
無効なヘッダーは、ヘッダーがないのと同じくらい悪いです。1つの間違った文字が、メールの脱線に必要なすべての可能性があります。PHPがこれらのエラーを検出しないため、構文が正しいことを確認してください。
$headers = array("From from@example.com", // missing colon
"Reply To: replyto@example.com", // missing hyphen
"X-Mailer: "PHP"/" . PHP_VERSION // bad quotes
);
偽のFrom:
送信者を使用しない
メールにはFrom:送信者が必要ですが、値を使用することはできません。特に、ユーザーが指定した送信者アドレスは、メールをブロックする確実な方法です。
$headers = array("From: $_POST[contactform_sender_email]"); // No!
理由:ウェブサーバーまたは送信メールサーバーが、@ hotmailまたは@gmailアドレスを担当しているふりをするSPF / DKIMホワイトリストに登録されていません。From:
設定されていない送信者ドメインのメールを静かにドロップすることさえあります。
受信者の値が正しいことを確認してください
場合によっては、メールの受信者の値が正しくないという単純な問題が発生することもあります。これは、誤った変数を使用したことが原因である可能性があります。
$to = 'user@example.com';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to
これをテストする別の方法は、受信者の値をmail()
関数呼び出しにハードコードすることです。
mail('user@example.com', $subject, $message, $headers);
これはすべてのmail()
パラメータに適用できます。
複数のアカウントに送信
メールアカウントの問題を除外するには、さまざまなメールプロバイダーの複数のメールアカウントにメールを送信します。メールがユーザーのGmailアカウントに届かない場合は、同じメールをYahooアカウント、Hotmailアカウント、および通常のPOP3アカウント(ISP提供のメールアカウントなど)に送信します。
他のメールアカウントのすべてまたは一部にメールが届いた場合、コードがメールを送信していることがわかりますが、メールアカウントプロバイダーが何らかの理由でメールをブロックしている可能性があります。メールがどのメールアカウントにも届かない場合、問題はコードに関連している可能性が高くなります。
コードがフォームメソッドと一致することを確認してください
フォームメソッドをに設定POST
した場合は、を使用$_POST
してフォームの値を検索していることを確認してください。に設定したGET
か、まったく設定しなかった場合は、を使用$_GET
してフォームの値を検索してください。
フォームのaction
値が正しい場所を指していることを確認してください
フォームaction
属性に、PHPメーリングコードを指す値が含まれていることを確認してください。
<form action="send_email.php" method="POST">
Webホストが電子メールの送信をサポートしていることを確認してください
一部のWebホスティングプロバイダーは、サーバーを介した電子メールの送信を許可または有効にしません。この理由はさまざまですが、メールの送信が無効になっている場合は、サードパーティを使用してそれらのメールを送信する別の方法を使用する必要があります。
(オンラインサポートまたはFAQにアクセスした後の)テクニカルサポートへのメールで、サーバーでメール機能が利用できるかどうかを明確にする必要があります。
localhost
メールサーバーが設定されていることを確認してください
WAMP、MAMP、またはXAMPPを使用してローカルワークステーションで開発している場合、ワークステーションに電子メールサーバーがインストールされていない可能性があります。これがないと、PHPはデフォルトでメールを送信できません。
基本的なメールサーバーをインストールすることでこれを克服できます。Windowsの場合、無料のMercury Mailを使用できます。
SMTPを使用してメールを送信することもできます。これを行う方法については、Vikas Dwivediからのすばらしい回答を参照してください。
PHPのカスタムを有効にする mail.log
MTAとPHPのログファイルに加えて、mail()
関数のロギングを有効にすることができます。それは完全なSMTP対話を記録しませんが、少なくとも関数呼び出しパラメーターと呼び出しスクリプトを記録します。
ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);
詳細については、http://php.net/manual/en/mail.configuration.phpを参照してください。(これは、これらのオプションを有効にするのが最善ですphp.ini
か.user.ini
または.htaccess
多分。)
メールテストサービスで確認する
MTA /ウェブサーバーの設定をテストするために利用できるさまざまな配信およびスパム性チェックサービスがあります。通常、メールプローブの宛先:のアドレスを送信してから、配信レポートを取得し、後で具体的なエラーや分析を取得します。
別のメーラーを使用する
PHPの組み込みmail()
関数は便利で、多くの場合、仕事をこなしてくれますが、欠点があります。幸い、上で概説した問題の多くを処理することを含む、より強力で柔軟性のある代替手段があります。
これらはすべて、専門のSMTPサーバー/サービスプロバイダーと組み合わせることができます。(通常の08/15共有Webホスティングプランは、電子メールのセットアップ/構成可能性に関しては失敗するためです。)