PHP メール関数が電子メールの送信を完了できませんでした
P粉257342166
2023-08-27 14:03:20
<p><br /></p>
<pre class="brush:php;toolbar:false;"><?php
$name = $_POST['名前'];
$email = $_POST['email'];
$message = $_POST['メッセージ'];
$from = 'From: yoursite.com';
$to = 'contact@yoursite.com';
$subject = 'お客様からのお問い合わせ';
$body = "差出人: $namen 電子メール: $emailn メッセージ:n $message";
if ($_POST['submit']) {
if (mail ($to, $subject, $body, $from)) {
echo '<p>メッセージは送信されました!</p>';
} それ以外 {
echo '<p>問題が発生しました。戻ってやり直してください!</p>';
}
}
?></pre>
<p>簡単なメールフォームを作成しようとしています。フォーム自体は私の <code>index.html</code> ページにありますが、別の「送信ありがとうございます」ページ、<code>thankyou.php</code> に送信されます。 PHP コードが埋め込まれています。
コードは完全に送信されますが、電子メールは送信されません。この問題はどうすれば解決できますか? </p>
この回答の一部は
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()
mail()を使用する場合のみ。
Check戻り値
mail()
関数:
これは注目に値します:FALSE- を受け取った場合は、メールを受け入れるサーバーにエラーがあることがわかります。これはコーディングの問題ではなく、サーバー構成の問題である可能性があります。この問題が発生する理由を確認するには、システム管理者に問い合わせる必要があります。
戻り値 TRUE- を受け取った場合でも、電子メールが送信されるわけではありません。これは単に、電子メールが PHP 経由でサーバー上の適切なハンドラーに正常に送信されたことを意味します。 PHP の制御を超えて電子メールの送信を妨げる障害ポイントは他にもたくさんあります。
したがって、
FALSEは正しい方向を示すのに役立ちますが、
ホスティングプロバイダーが電子メールの送信を許可しており、メール送信を制限していないことを確認してください
TRUE
は必ずしもメールが正常に送信されたことを意味するわけではありません。注目に値します!多くの共有 Web ホスト、特に無料の Web ホスティング プロバイダーは、サーバーからの電子メールの送信を許可していないか、一定期間内に送信できる数を制限しています。これは、スパマーがその安価なサービスを利用することを制限するために、彼らが懸命に取り組んでいるからです。
ホストに電子メール制限があるか、電子メールの送信をブロックしていると思われる場合は、よくある質問をチェックして、そのような制限がリストされているかどうかを確認してください。それ以外の場合は、サポートに連絡して、電子メールの送信に制限があるかどうかを確認する必要がある場合があります。
スパム フォルダーを確認し、メールがスパムとしてマークされるのを防ぎます
PHP (およびその他のサーバーサイド プログラミング言語) 経由で送信された電子メールは、さまざまな理由から受信者のスパム フォルダーに到達してしまうことがよくあります。コードのトラブルシューティングを行う前に、必ずそこを確認してください。
PHP 経由で送信された電子メールが受信者のスパム フォルダーに送信されないようにするには、PHP コードで行うことや、電子メールがスパムとしてマークされる可能性を最小限に抑えるためにできることがいくつかあります。
マイケル・デ・メア良いヒントは次のとおりです: このトピックの詳細については、「プログラムによって送信された電子メールが自動的にスパムとしてマークされないようにする方法」を参照してください。
。すべての電子メールヘッダーが提供されていることを確認してください
一部のスパム ソフトウェアは、「From」や「Reply」などの一般的なヘッダーが欠落しているメッセージを拒否します。リーリー
メールヘッダーに構文エラーがないことを確認してくださいはこれらのエラーを
検出しないため、構文が正しいことを再確認してください。リーリー 偽のものを使用しないでください 送信者:
送信者メッセージには 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.log
MTA および PHP ログ ファイルに加えて、mail() 関数-
mail-tester.example(無料/簡単)
-
glockapps.com(無料/$$$)
-
senforensics.com(登録/$$$)
-
mailtrap.io (プロ/$$$)
-
ultratools/…/emailTest (無料/MX チェックのみ)
- さまざま:http://www.verticalresponse.com/blog /7-電子メール テスト配信ツール/
の特定のログを有効にすることもできます。完全な SMTP インタラクションを記録するわけではありませんが、少なくとも関数呼び出しパラメーターと呼び出しスクリプトを記録します。
リーリー詳細については、http://php.net/manual/en/mail.configuration.php を参照してください。 (これらのオプションを
php.ini
または.user.ini
または.htaccess
で有効にすることが最善です。)チェックメールテストサービス
さまざまな配信およびスパム チェック サービスを使用して、MTA/Web サーバーのセットアップをテストできます。通常、メール プローブを次のアドレスに送信し、後で配信レポートとより具体的な障害または分析を取得します:
別の電子メール プログラムを使用する
PHP の組み込み
mail()
関数は便利で、通常は仕事を完了させますが、欠点もあります。幸いなことに、上記の問題の多くを処理するなど、より強力で柔軟性を提供する代替手段があります。最も人気のあるものは次のとおりです:- PHPMailer
同様に強力: - SwiftMailer
または古い - PEAR::Mail も可能です。
これらはすべて、専門的な SMTP サーバー/サービス プロバイダーと組み合わせて使用できます。 (一般的な 08/15 共有 Web ホスティング プランは、電子メールのセットアップ/構成に当たり外れがあるためです。)