PHPのメール機能でメール送信が完了しない

php html email


<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com';
    $to = '[email protected]';
    $subject = 'Customer Inquiry';
    $body = "From: $name\n E-Mail: $email\n Message:\n $message";

    if ($_POST['submit']) {
        if (mail ($to, $subject, $body, $from)) {
            echo '<p>Your message has been sent!</p>';
        } else {
            echo '<p>Something went wrong, go back and try again!</p>';
        }
    }
?>

簡単なメールフォームを作成してみました。フォーム自体は私の index.html ページにありますが、上記のPHPコードが埋め込まれた別の「送信ありがとうございます」ページである thankyou.php に送信されます。コードは完全に送信されますが、電子メールは送信されません。どうすれば修正できますか?




Answer 1 John Conde


この回答には、 mail() 関数自体の使用にのみ適用される部分がありますが、これらのトラブルシューティング手順の多くは、任意のPHPメーリングシステムに適用できます。

スクリプトが電子メールを送信していないように見える理由はさまざまです。明らかな構文エラーがない限り、これらを診断するのは困難です。エラーがない場合は、以下のチェックリストを実行して潜在的な落とし穴を見つける必要があります。

エラー報告が有効になっていて、すべてのエラーを報告するように設定されていることを確認してください。

エラー報告は、コードのバグや 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を使用して接続してみてください。あなたはそのポートもブロックされていることがわかった場合は、唯一の解決策は、これらのポートのブロックを解除するためにあなたのホスティングプロバイダに連絡することです。

ほとんどのホスティングプロバイダは、スパムメールの送信からネットワークを保護するために、これらの電子メールポートをブロックしています。

plainTLS 接続にはポート 25 または 587 を、SSL 接続にはポート 465 を使用してください。ほとんどのユーザーは、一部のホスティングプロバイダによって設定されたレート制限を避けるために、ポート 587 を使用することをお勧めします。

エラー抑制演算子を使用しない

ときにエラー抑制演算子 @ は、 PHPでの式の前に付加され、その式により生成される可能性があるすべてのエラーメッセージは無視されます。この演算子を使用する必要がある状況がありますが、メールの送信はそれらの1つではありません

コードに @mail(...) が含まれている場合、デバッグに役立つ重要なエラーメッセージを非表示にしている可能性があります。 @ を削除し、エラーが報告されていないか確認してください。

後で具体的なエラーについて error_get_last()確認する場合にのみお勧めします。

mail() の戻り値を確認する

mail() 関数:

メールの配信が正常に受け入れられた場合は TRUE を、それ以外の場合は FALSE を返します。メールが配信のために受け入れられたからといって、メールが実際に目的の宛先に届くわけではないことに注意することが重要です。

これは、注意すべき点です。

  • あなたが受け取る場合 FALSE の戻り値場合、エラーはサーバーがメールを受け入れることにあることがわかります。これはおそらくコーディングの問題ではなく、サーバー構成の問題です。これが発生している理由を調べるには、システム管理者に相談する必要があります。
  • あなたが受け取った場合は TRUE を戻り値をメールが確実に送信されるわけではありません。これは、PHPによってサーバー上の対応するハンドラーに電子メールが正常に送信されたことを意味します。PHPの制御外に、電子メールが送信されない原因となる可能性のある、さらに多くの障害点があります。

したがって、 FALSE は正しい方向を示すのに役立ちますが、 TRUEそうではありませ必ずしも電子メールが正常に送信されたことを意味するあり。これは重要です!

ホスティングプロバイダがメールの送信を許可し、メールの送信を制限していないことを確認してください。

多くの共有のWebホスト、特に無料のWebホスティングプロバイダは、どちらかのサーバーから電子メールを送信することができないか、または任意の時間帯に送信することができます量を制限しています。これは、彼らの安いサービスを利用してスパマーを制限するための彼らの努力によるものです。

ホストがメール送信の制限やブロックをしていると思われる場合は、そのホストがそのような制限をリストアップしているかどうかを確認するために、そのホストの FAQ を確認してください。そうでない場合は、そのホストのサポートに連絡して、メール送信に関する制限があるかどうかを確認する必要があるかもしれません。

迷惑メールフォルダをチェックし、迷惑メールとしてフラグが立てられないようにします。

様々な理由で、PHP (およびその他のサーバーサイドのプログラミング言語)を使って送信されたメールが、受信者のスパムフォルダに入ってしまうことがよくあります。コードをトラブルシューティングする前に、必ずそこをチェックしてください。

PHP経由で送信されたメールが受信者の迷惑メールフォルダーに送信されないようにするために、PHPコードやその他の方法で、メールが迷惑メールとしてマークされる可能性を最小限に抑えるために、さまざまなことができます。ミシエル・デ・マーレからの良いヒントは次のとおりです。

  • メールとドメイン名が同じであることを証明し、ドメイン名のなりすましを防ぐには、SPFDKIMなどのメール認証方法を使用します。SPF Webサイトには、サイトのDNS情報を生成するためのウィザードが含まれています。
  • 逆引きDNSをチェックして、メールサーバーのIPアドレスがメールの送信に使用するドメイン名を指していることを確認します。
  • 使用しているIPアドレスがブラックリストに含まれていないことを確認してください
  • 返信先アドレスが有効な既存のアドレスであることを確認してください。
  • [宛先]フィールドには、電子メールアドレスだけでなく、完全な実名の宛先を使用します(例: "John Smith" <[email protected]> ))。
  • そのような [email protected][email protected] などの虐待アカウントを監視します。つまり、これらのアカウントが存在することを確認し、送られてきた内容を読み、苦情に対処してください。
  • 最後に、登録解除を本当に簡単にします。そうしないと、ユーザーはスパムボタンを押して購読を解除し、評判に影響を与えます。

プログラムで送信するメールが自動的にスパムとしてマークされないようにするにはどうすればよいですかをご覧ください。このトピックの詳細については。

すべてのメールヘッダが提供されていることを確認してください。

迷惑メールソフトによっては、「From」や「Reply-to」などの一般的なヘッダが欠落しているとメールを拒否してしまうものがあります。

$headers = array("From: [email protected]",
    "Reply-To: [email protected]",
    "X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);

メールヘッダに構文エラーがないことを確認する

無効なヘッダーは、ヘッダーがないのと同じくらい悪いです。1つの間違った文字が、メールの脱線に必要なすべての可能性があります。PHPがこれらのエラーを検出しないため、構文が正しいことを再確認してください。

$headers = array("From [email protected]", // missing colon
    "Reply To: [email protected]",      // 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 = '[email protected]';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to

これをテストする別の方法は、受信者の値を mail() 関数呼び出しにハードコードすることです。

mail('[email protected]', $subject, $message, $headers); 

これは、すべての mail() パラメータに適用できます。

複数のアカウントに送信

メールアカウントの問題を除外するには、さまざまなメールプロバイダーの複数のメールアカウントにメールを送信します。メールがユーザーのGmailアカウントに届かない場合は、同じメールをYahooアカウント、Hotmailアカウント、および通常のPOP3アカウント(ISP提供のメールアカウントなど)に送信してください。

メールがすべてのメールアカウント、または他のメールアカウントの一部に届く場合は、あなたのコードがメールを送信していることがわかりますが、メールアカウントのプロバイダが何らかの理由でメールをブロックしている可能性があります。どのメールアカウントにもメールが届かない場合は、コードに関連した問題である可能性が高いです。

コードがフォームメソッドと一致していることを確認してください。

フォームメソッドを POST に設定した場合は、 $_POST POSTを使用してフォームの値を検索していることを確認してください。 GET に設定した場合、またはまったく設定しなかった場合は、 $_GET GETを使用してフォームの値を検索してください。

フォーム action 値が正しい場所を指していることを確認してください

フォーム action 属性に、PHPメーリングコードを指す値が含まれていることを確認してください。

<form action="send_email.php" method="POST">

ウェブホストが電子メールの送信をサポートしていることを確認してください。

一部のウェブホスティングプロバイダーでは、サーバーを介したメールの送信を許可していない、または許可していない場合があります。その理由は様々ですが、メールの送信を無効にしている場合は、第三者を利用してメールを送信する別の方法を利用する必要があります。

テクニカルサポートへのメール(オンラインサポートや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 でこれらのオプションを有効にすることをお勧めします。)

メールテストサービスで確認

MTAwebserverのセットアップをテストするために利用できる様々な配信およびスパムメールチェックサービスがあります。一般的には、メールプローブを送信して、相手のアドレスに送信し、配信レポートとより具体的な失敗や分析を後から得ることができます。

別のメーラーを使う

PHPの組み込みの mail() 関数は便利で、多くの場合、仕事をこなしますが、欠点があります。幸い、上で概説した問題の多くを処理することを含む、より強力で柔軟性のある代替手段があります。

プロのSMTPサーバーサービスプロバイダと組み合わせることができるすべての。典型的な0815共有のWebホスティングプランは、それが電子メールのsetupconfigurabilityに来るときにヒットまたはミスしているので)。




Answer 2 er.irfankhan11


メール機能にメールヘッダを追加します。

$header = "From: [email protected]\r\n";
$header.= "MIME-Version: 1.0\r\n";
$header.= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$header.= "X-Priority: 1\r\n";

$status = mail($to, $subject, $message, $header);

if($status)
{
    echo '<p>Your mail has been sent!</p>';
} else {
    echo '<p>Something went wrong. Please try again!</p>';
}



Answer 3 sonam gupta


  1. 必ずメール機能でヘッダを送信してみてください。
  2. localhost経由でメールを送信している場合は、メール送信用のSMTP設定を行います。
  3. サーバー経由でメールを送信している場合は、サーバーでメール送信機能が有効になっていることを確認してください。



Answer 4 oneDerer


電子メールの送信にSMTP構成を使用している場合は、代わりにPHPMailerを使用してみてください。ライブラリはhttps://github.com/PHPMailer/PHPMailerからダウンロードできます。

このようにして送信メールを作成しました。

function send_mail($email, $recipient_name, $message='')
{
    require("phpmailer/class.phpmailer.php");

    $mail = new PHPMailer();

    $mail->CharSet = "utf-8";
    $mail->IsSMTP();                                      // Set mailer to use SMTP
    $mail->Host = "mail.example.com";  // Specify main and backup server
    $mail->SMTPAuth = true;     // Turn on SMTP authentication
    $mail->Username = "myusername";  // SMTP username
    $mail->Password = "[email protected]"; // SMTP password

    $mail->From = "[email protected]";
    $mail->FromName = "System-Ad";
    $mail->AddAddress($email, $recipient_name);

    $mail->WordWrap = 50;                                 // Set word wrap to 50 characters
    $mail->IsHTML(true);                                  // Set email format to HTML (true) or plain text (false)

    $mail->Subject = "This is a Sampleenter code here Email";
    $mail->Body    = $message;
    $mail->AltBody = "This is the body in plain text for non-HTML mail clients";
    $mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
    $mail->addAttachment('files/file.xlsx');

    if(!$mail->Send())
    {
       echo "Message could not be sent. <p>";
       echo "Mailer Error: " . $mail->ErrorInfo;
       exit;
    }

    echo "Message has been sent";
}



Answer 5 user1258544


メールを送信する前にヘッダを追加するだけです。

<?php 
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = '[email protected]'; 
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html\r\n";
$headers .= 'From: [email protected]' . "\r\n" .
'Reply-To: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

後もう一つ。 mail() 関数は、ローカルホストで動作していません。コードをサーバーにアップロードして試してください。