P粉1112278982023-08-28 11:30:52
この回答の一部は mail()
関数自体の使用にのみ適用されますが、これらのトラブルシューティング手順の多くは任意の PHP メール システムに適用できます。 嗯>
スクリプトが電子メールを送信できない理由はいくつかあります。明らかな構文エラーがない限り、これらを診断するのは困難です。そうでない場合は、以下のチェックリストを参照して、遭遇する可能性のある落とし穴を探してください。
エラー報告は、PHP で発生する一般的なエラーだけでなく、コード内のバグを根絶するためにも重要です。これらのエラーを受信するには、エラー報告を有効にする必要があります。次のコードを PHP ファイルの先頭 (またはメインの構成ファイル) に配置すると、エラー報告が有効になります。
リーリー参照 PHP で有用なエラー メッセージを取得するには? — この回答 詳細については。
mail()
関数を呼び出してください これはばかげているように思えるかもしれませんが、よくある間違いはコード内に mail()
関数を実際に配置するのを忘れることです。コメントアウトされていないことを確認してください。
mail()
functionmail 関数は 3 つの必須パラメーターと、オプションの 4 番目と 5 番目のパラメーターを受け取ります。 mail()
への呼び出しに少なくとも 3 つの引数がないと、呼び出しは失敗します。
mail()
への呼び出しが正しいパラメータを正しい順序で提供しない場合も、呼び出しは失敗します。
Web サーバーは、Web サーバーを介して電子メールを送信するすべての試行を記録する必要があります。これらのログの場所は状況によって異なります (サーバー管理者に場所を問い合わせる必要がある場合があります) が、通常はユーザーのルート ディレクトリの logs
の下にあります。中には、電子メールの送信試行に関連してサーバーによって報告されたエラー メッセージ (存在する場合) が表示されます。
ポートのブロックは、SMTP を使用して電子メールを送信するコードを統合する際に、ほとんどの開発者が直面する非常に一般的な問題です。また、これはサーバーのメール ログで簡単に追跡できます (前述したように、メール ログ サーバーの場所はサーバーごとに異なる場合があります)。共有ホスティング サーバーを使用している場合、ポート 25 と 587 は引き続きデフォルトでブロックされます。このブロックは、ホスティング プロバイダーによって意図的に行われます。これは一部の専用サーバーにも当てはまります。これらのポートがブロックされている場合は、ポート 2525 を使用して接続してみてください。ポートもブロックされていることが判明した場合、唯一の解決策は、ホスティング プロバイダーに連絡してこれらのポートのブロックを解除することです。
ほとんどのホスティング プロバイダーは、送信されるスパムからネットワークを保護するために、これらの電子メール ポートをブロックします。
通常/TLS 接続にはポート 25 または 587 を使用し、SSL 接続にはポート 465 を使用します。ほとんどのユーザーは、一部のホスティング プロバイダーによって設定されたレート制限を回避するために、ポート 587 を使用することをお勧めします。
エラー抑制演算子 @
が PHP の式の前に追加されると、その式によって生成される可能性のあるエラー メッセージは無視されます。この演算子が必要な状況がありますが、メール の送信は の 1 つではありません。
コードに @mail(...)
が含まれている場合は、デバッグに役立つ重要なエラー メッセージが隠れている可能性があります。 #@ を削除し、エラーが報告されるかどうかを確認します。
error_get_last() を使用する場合のみ。
Check
mail() 関数:
これは注目に値します:
戻り値
戻り値
は正しい方向を示すのに役立ちますが、TRUE
は必ずしもメールが正常に送信されたことを意味するわけではありません。注目に値します!
ホスティングプロバイダーが電子メールの送信を許可しており、メール送信を制限していないことを確認してください
ホストに電子メール制限があるか、電子メールの送信をブロックしていると思われる場合は、よくある質問をチェックして、そのような制限がリストされているかどうかを確認してください。それ以外の場合は、サポートに連絡して、電子メールの送信に制限があるかどうかを確認する必要がある場合があります。
スパム フォルダーを確認し、メールがスパムとしてマークされるのを防ぎます
PHP 経由で送信された電子メールが受信者のスパム フォルダーに送信されないようにするには、PHP コードで行うことや、電子メールがスパムとしてマークされる可能性を最小限に抑えるためにできることがいくつかあります。
マイケル・デ・メア良いヒントは次のとおりです: このトピックの詳細については、「プログラムによって送信された電子メールが自動的にスパムとしてマークされないようにする方法」を参照してください。
。すべての電子メールヘッダーが提供されていることを確認してください
一部のスパム ソフトウェアは、「From」や「Reply」などの一般的なヘッダーが欠落しているメッセージを拒否します。無効なヘッダーは、ヘッダーがまったくないのと同じくらい問題です。 1 文字でも間違っていると、電子メールが正常に送信されなくなる可能性があります。 PHP
リーリー 偽のものを使用しないでください 送信者:
送信者メッセージには From:Sender が必要ですが、
任意の リーリー
原因: ネットワークまたは送信メール サーバーは SPF/DKIM ホワイトリストに登録されていないため、@hotmail または @gmail アドレスを担当するふりをすることができません。送信者ドメインが構成されていない From:
を持つメッセージをサイレントにドロップする場合もあります。
問題は、電子メール受信者の値が間違っているという単純な場合もあります。これは、間違った変数が使用されていることが原因である可能性があります。
リーリーこの問題をテストする別の方法は、受信者の値を mail()
関数呼び出しにハードコードすることです:
これは、すべての mail()
パラメータに適用できます。
電子メール アカウントの問題のトラブルシューティングを行うには、異なる電子メール プロバイダーの複数の電子メール アカウントに電子メールを送信してください。 。電子メールがユーザーの Gmail アカウントに届かない場合は、同じ電子メールを Yahoo アカウント、Hotmail アカウント、および通常の POP3 アカウント (ISP によって提供される電子メール アカウントなど) に送信します。
他の電子メール アカウントのすべてまたは一部に電子メールが届いた場合、コードが電子メールを送信していることはわかりますが、電子メール アカウント プロバイダーが何らかの理由で電子メールをブロックしている可能性があります。どのメール アカウントにもメールが届かない場合、問題はコードに関連している可能性が高くなります。
フォーム メソッドを POST
に設定した場合は、必ず $_POST
を使用してフォームの値を見つけてください。 GET
に設定した場合、またはまったく設定しなかった場合は、必ず $_GET
を使用してフォーム値を検索してください。
アクション
値が正しい場所を指していることを確認してください フォームの action
属性に、PHP メール コードを指す値が含まれていることを確認してください。
一部の Web ホスティング プロバイダーは、サーバーを介した電子メール送信を許可または有効にしていません。この理由はさまざまですが、電子メールの送信がブロックされている場合は、これらの電子メールを送信するサードパーティの代替手段を使用する必要があります。
(オンライン サポートまたは FAQ にアクセスした後) テクニカル サポートに送信される電子メールには、サーバーで電子メール機能が利用可能かどうかが明記されています。
localhost
メールサーバーWAMP、MAMP、または XAMPP を使用してローカル ワークステーションで開発する場合、ワークステーションに電子メール サーバーがインストールされていない可能性があります。そうしないと、PHP はデフォルトで電子メールを送信できなくなります。
この問題は、基本的なメール サーバーをインストールすることで解決できます。 Windows の場合は、無料の Mercury Mail を使用できます。
SMTP を使用して電子メールを送信することもできます。これを行う方法については、>Vikas Dwivedi によるこの素晴らしい回答を参照してください。
PHP カスタマイズを有効にする
mail() 関数 詳細については、http://php.net/manual/en/mail.configuration.php を参照してください。 (これらのオプションを さまざまな配信およびスパム チェック サービスを使用して、MTA/Web サーバーのセットアップをテストできます。通常、メール プローブを次のアドレスに送信し、後で配信レポートとより具体的な障害または分析を取得します: PHP の組み込み の特定のログを有効にすることもできます。完全な SMTP インタラクションを記録するわけではありませんが、少なくとも関数呼び出しパラメーターと呼び出しスクリプトを記録します。
リーリー
php.ini
または .user.ini
または .htaccess
で有効にすることが最善です。) チェックメールテストサービス
別の電子メール プログラムを使用する
mail()
関数は便利で、通常は仕事を完了させますが、欠点もあります。幸いなことに、上記の問題の多くを処理するなど、より強力で柔軟性を提供する代替手段があります。
最も人気のあるものは次のとおりです:
これらはすべて、専門的な SMTP サーバー/サービス プロバイダーと組み合わせて使用できます。 (一般的な 08/15 共有 Web ホスティング プランは、電子メールのセットアップ/構成に当たり外れがあるためです。)