如何解决使用 PHPMailer 和 ReCaptcha V2 联系我们
我想使用下面的联系我们表格;我测试了它,并发送了电子邮件。我无法解决的问题很少,因此我在开发站点上使用该表单。问题是:
- 当用户在表单为空时点击发送电子邮件按钮时,他不会收到需要 ReCaptcha 字段的提醒。
- 如果您填写表格并完全忽略 ReCaptcha 并点击发送按钮,您将被带到一个白页,并且不会发送电子邮件。显然,这是一个没有正确传达给用户的错误。
- 如果您正确填写表单并点击发送,则感谢页面的代码不会捕获您的消息。我尝试同时使用
GET
和Post
。例如:<?php echo $_POST["name"]?>
和<?php echo $_GET["name"]?>
。
我使用 PHP 8.0.3 版。 如果有人能帮我解决这些问题,我将不胜感激。
Index.php
<!DOCTYPE HTML>
<html>
<head>
<title>Test form to email</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<link rel="stylesheet" type="text/css" href="style.css">
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
</head>
<body>
<div class ="container">
<div class="col-lg-6 push-lg-3">
<h1> Contact us</h1>
<p>Fill out the below form to contact us</p>
<form id= "contactus" method= "post" action= "send.php">
<input type= "text" name = "name" class = "form-control" placeholder="your Name" required><br />
<input type= "tel" name = "phone" class = "form-control" placeholder="your Phone" required><br />
<input type= "email" name = "email" class = "form-control" placeholder="your email address" required><br />
<textarea name="message" placeholder="your Message" class = "form-control" required></textarea><br />
<div class="g-recaptcha" data-sitekey="ENTER_YOUR_SITE_KEY_HERE"></div><br />
<button type= "submit" class = "btn btn-success">Send email</button>
</form>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js" integrity="sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP+u1T9qYdvdihz0PPSiiqn/+/3e7Jo4EaG7TubfWGUrMQ==" crossorigin="anonymous"></script>
<script src="./js/jquery.validate.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>
<script>
$("#contactus").validate();
</script>
</body>
</html>
send.php
<?php
/**
* Contact us form for PHPMailer and ReCaptcha V2.
* Built based on the following resources
* https://www.youtube.com/watch?v=3o0WXaXfUwI
* https://stackoverflow.com/questions/50253428/verify-recaptcha-v2-always-false
* This code is not yet final and requires refinement and help from the great community of stackoverflow.com
*/
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require 'vendor/phpmailer/phpmailer/src/PHPMailer.php'; //confirm this path
require 'vendor/phpmailer/phpmailer/src/SMTP.php'; //confirm this path
require 'vendor/phpmailer/phpmailer/src/Exception.php'; //confirm this path
//get the variables from the form
$name = filter_var($_POST['name'],FILTER_SANITIZE_STRING);
$phone = filter_var($_POST['phone'],FILTER_SANITIZE_STRING);
$email = filter_var($_POST['email'],FILTER_SANITIZE_STRING);
$message = filter_var($_POST['message'],FILTER_SANITIZE_STRING);
//validations
if(empty($name)){
header("location:index.php?nouser");
exit();
}
if(empty($phone)){
header("location:index.php?nophone");
exit();
}
if(empty($email)){
header("location:index.php?noemail");
exit();
}
if(empty($message)){
header("location:index.php?nomessage");
exit();
}
//PHPMailer desfault validations
//Apply some basic validation and filtering to the email
if (array_key_exists('email',$_POST)) {
$email = substr(strip_tags($_POST['email']),255);
} else {
$email = 'No email';
}
//Apply some basic validation and filtering to the message
if (array_key_exists('message',$_POST)) {
//Limit length and strip HTML tags
$message = substr(strip_tags($_POST['message']),16384);
} else {
$message = '';
$msg = 'No message provided!';
$err = true;
}
//Apply some basic validation and filtering to the name
if (array_key_exists('name',$_POST)) {
//Limit length and strip HTML tags
$name = substr(strip_tags($_POST['name']),255);
} else {
$name = '';
}
//Load Composer's autoloader
require 'vendor/autoload.php'; //confirm this path
$response = isset($_POST["g-recaptcha-response"]) ? $_POST['g-recaptcha-response'] : null;
$privatekey = "ENTER_YOUR_PRIVATE_KEY"; //Enter your secret key here
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,"https://www.google.com/recaptcha/api/siteverify");
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POST,CURLOPT_POSTFIELDS,array(
'secret' => $privatekey,'response' => $response,'remoteip' => $_SERVER['REMOTE_ADDR']
));
$resp = json_decode(curl_exec($ch));
curl_close($ch);
if ($resp->success) {
//Instantiation and passing `true` enables exceptions
$mail = new PHPMailer(true);
try {
//Server settings
$mail->SMTPDebug = 0; //Enable verbose debug output
$mail->isSMTP(); //Send using SMTP
$mail->Host = 'mail.example.com'; //Set the SMTP server to send through
$mail->SMTPAuth = true; //Enable SMTP authentication
$mail->Username = 'support@example.com'; //SMTP username
$mail->Password = 'PASSWORD'; //SMTP password
$mail->SMTPSecure = 'tls'; //Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` encouraged
$mail->Port = 587; //TCP port to connect to,use 465 for `PHPMailer::ENCRYPTION_SMTPS` above
//Sender
$mail->setFrom('sender@example.com','Mr.sender');
//Recipients
$mail->addAddress('recipient@example.com','Mr. Recipient'); //Add a recipient
//Body content
$body = "<p><strong>Hello</strong>,you have received an inquiry from " . $name . " the message is " . $message . " you can contact the sender by phone on " . $phone . " or by email on " . $email . "</p>";
//Content
$mail->isHTML(true); //Set email format to HTML
$mail->Subject = 'Website inquiry from ' . $name;
$mail->email = 'The sender email ' . $email;
$mail->Body = $body;
$mail->AltBody = strip_tags($body);
$mail->send();
//echo 'Message has been sent'; // select this if you want to echo that the message has been snet
header("location: thankyou.php"); // Select this if you want to redirect to a thank you page
} catch (Exception $e) {
echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
}
?>
thankyou.php
<!DOCTYPE HTML>
<html>
<head>
<title>Thank you <?php echo $_GET['name'];?> </title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<div class="container mt-5 text-center">
<body>
<h1>Thank You <?php echo $_GET['name'];?></h1>
<p>We have received your inquiry. Here is the information you have submitted:</p>
<ol>
<li><em>Name:</em> <?php echo $_GET["name"]?></li>
<li><em>Email:</em> <?php echo $_GET["email"]?></li>
<li><em>Phone:</em> <?php echo $_GET["phone"]?></li>
<li><em>Message:</em> <?php echo $_GET["message"]?></li>
</ol>
</body>
</div>
</body>
</html>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。