简体   繁体   中英

Why isn't my php mailer with Google recaptcha v3 working properly? It says it was sent, but I haven't received any emails

i am using this example from google-recaptcha-v3-example-demo i did every step all is good also i am getting echo message that the message is sent so the form is working perfectly but i am still not receiving the emails the following is my code.

<?php

if ($_SERVER["REQUEST_METHOD"] == "POST") {

 # BEGIN Setting reCaptcha v3 validation data
 $url = "https://www.google.com/recaptcha/api/siteverify";
 $data = [
'secret' => "mysecretcode",
'response' => $_POST['token'],
'remoteip' => $_SERVER['REMOTE_ADDR']
 ];

  $options = array(
   'http' => array(
  'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
  'method'  => 'POST',
  'content' => http_build_query($data)
  )
  );

   # Creates and returns stream context with options supplied in options preset 
   $context  = stream_context_create($options);
   # file_get_contents() is the preferred way to read the contents of a file into a string
   $response = file_get_contents($url, false, $context);
   # Takes a JSON encoded string and converts it into a PHP variable
   $res = json_decode($response, true);
   # END setting reCaptcha v3 validation data

   // print_r($response); 
   # Post form OR output alert and bypass post if false. NOTE: score conditional is optional
   # since the successful score default is set at >= 0.5 by Google. Some developers want to
   # be able to control score result conditions, so I included that in this example.

  if ($res['success'] == true && $res['score'] >= 0.5) {

  # Recipient email
  $mail_to = "myemail@gmail.com";

  # Sender form data
  $subject = trim($_POST["subject"]);
  $name = str_replace(array("\r","\n"),array(" "," ") , strip_tags(trim($_POST["name"])));
  $email = filter_var(trim($_POST["email"]), FILTER_SANITIZE_EMAIL);
  $phone = trim($_POST["phone"]);
  $message = trim($_POST["message"]);

  if (empty($name) OR !filter_var($email, FILTER_VALIDATE_EMAIL) OR empty($phone) OR 
  empty($subject) OR empty($message)) {
  # Set a 400 (bad request) response code and exit
  http_response_code(400);
  echo '<p class="alert-warning">Please complete the form and try again.</p>';
  exit;
  }

  # Mail content
  $content = "Name: $name\n";
  $content .= "Email: $email\n\n";
  $content .= "Phone: $phone\n";
  $content .= "Message:\n$message\n";

  # Email headers
  $headers = "From: $name <$email>";

 # Send the email
  $success = mail($mail_to, $subject, $content, $headers);

  if ($success) {
  # Set a 200 (okay) response code
  http_response_code(200);
  echo '<p class="alert alert-success">Thank You! Your message has been successfully sent. 
 </p>';
} else {
  # Set a 500 (internal server error) response code
  http_response_code(500);
  echo '<p class="alert alert-warning">Something went wrong, your message could not be sent. 
</p>';
  }   

  } else {

echo '<div class="alert alert-danger">
    Error! The security token has expired or you are a bot.
   </div>';
 }  

} else {
# Not a POST request, set a 403 (forbidden) response code
http_response_code(403);
echo '<p class="alert-warning">There was a problem with your submission, please try again. 
 </p>';
  } ?>

and thats the contact.html

   <!DOCTYPE html>
   <html lang="en">
   <head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>Document</title>
   <link rel="stylesheet" 
   href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
   <script src="https://www.google.com/recaptcha/api.js? 
   render=mysitekey"></script>
   </head>
  <body>
   <!-- contact form demo container -->
    <section style="margin: 50px 20px;">
    <div style="max-width: 768px; margin: auto;">
 
   <!-- contact form -->
    <div class="card">
   <h2 class="card-header">Contact Form</h2>
   <div class="card-body">
     <form class="contact_form" method="post" action="mail.php">

       <!-- form fields -->
       <div class="row">
         <div class="col-md-6 form-group">
           <input name="name" type="text" class="form-control" placeholder="Name" required>
         </div>
         <div class="col-md-6 form-group">
           <input name="email" type="email" class="form-control" placeholder="Email" required>
         </div>
         <div class="col-md-6 form-group">
           <input name="phone" type="text" class="form-control" placeholder="Phone" required>
         </div>
         <div class="col-md-6 form-group">
           <input name="subject" type="text" class="form-control" placeholder="Subject" 
         required>
         </div>
         <div class="col-12 form-group">
           <textarea name="message" class="form-control" rows="5" placeholder="Message" 
          required></textarea>
         </div>

         <!-- form message prompt -->
         <div class="row">
           <div class="col-12">
             <div class="contact_msg" style="display: none">
               <p>Your message was sent.</p>
             </div>
           </div>
         </div>

         <div class="col-12">
           <input type="submit" value="Submit Form" class="btn btn-success" name="post">
         </div>

         <!-- hidden reCaptcha token input -->
         <input type="hidden" id="token" name="token">
       </div>

     </form>
   </div>
    </div>

    </div>
    </section>
     <script>
      grecaptcha.ready(function() {
     grecaptcha.execute('mysitekey', {action: 
  'homepage'}).then(function(token) {
    // console.log(token);
    document.getElementById("token").value = token;
    });
 // refresh token every minute to prevent expiration
 setInterval(function(){
   grecaptcha.execute('mysitekey', {action: 
'homepage'}).then(function(token) {
     console.log( 'refreshed token:', token );
     document.getElementById("token").value = token;
   });
 }, 60000);

   });
 </script>

 <!-- References for the optional jQuery function to enhance end-user prompts -->
  <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
   <script src="form.js"></script>
   </body>
  </html>

I want all inquiries to be sent to my email address, even though I reduced the security in Google recaptcha, it is still not working.

This post solved my problem

$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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM