为什么这些输入验证不起作用? (通过 PHP & HTML & SMTP 服务器 & PHPmailer 联系我们)
P粉613735289
P粉613735289 2023-09-06 21:34:49
0
1
458

我正在使用PHP、HTML、SMTP 服务器和 PHPmailer 创建一个带有用户输入验证的联系我们表单。但是按“提交”按钮后,它给了我一个错误:

无效地址:(发件人): 致命错误:未捕获 PHPMailer\PHPMailer\Exception:无效地址:(来自):在 C:\xampp\htdocs\RESPONSIVE 中 SITE3_2\供应商\phpmailer\phpmailer\src\PHPMailer.php:1324 堆栈跟踪: #0 C:\xampp\htdocs\RESPONSIVE SITE3_2\send-email.php(74): PHPMailer\PHPMailer\PHPMailer->setFrom('', '') #1 {main} 抛出在 C:\xampp\htdocs\RESPONSIVE SITE3_2\vendor\phpmailer\phpmailer\src\PHPMailer.php 第 1324 行

PHP 代码

<?php

$name = $_POST["name"];
$email = $_POST["email"];
// $email = test_input($_POST["email"]);
$message = $_POST["message"];

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $emailErr = "Invalid email format";
} 

if (!preg_match("/^[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$/", $email)) {
    $emailErr = "Email should contain only letters, numbers, and underscores";
}

require "vendor/autoload.php";

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;

$mail = new PHPMailer(true);

$mail->SMTPDebug = SMTP::DEBUG_SERVER;

$mail->isSMTP();
$mail->SMTPAuth = true;

$mail->Host = "smtp.gmail.com";
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;

require_once 'config.php';
$mail->Username = SMTP_USERNAME;
$mail->Password = SMTP_PASSWORD;

$mail->setFrom($email, $name);
$mail->addAddress("myemail@gmail.com", "Ads");

$mail->Subject = $subject;
$mail->Body =  "Name: $name\nEmail: $email\n\n$message";

$mail->send();

header("Location: sent.html");
?>

HTML 代码

<form method="POST" action="send-email.php">
    <input type="text" name="name" id="name" placeholder="Name*">
    
    <input type="email" name="email" id="email" placeholder="Email*">
    <span class="error" style="color:red"><?php echo $emailErr;?></span>

    
    <textarea name="message" id="message" placeholder="Your Message*"></textarea>
    
    <button type="submit" name="submit" id="submit" class="button">Start</button>
</form>

我尝试了不同的教程 - 不成功。 我需要此表格

  • 验证用户输入,仅允许插入数字和字母(邮件字段)
  • 如果数据无效,错误消息必须出现在输入字段下

我对此很陌生,请用非常简单的语言解释一下:)

P粉613735289
P粉613735289

全部回复(1)
P粉924915787

诊断

如果任一验证 if 语句为 true,则将设置一个字符串变量 $emailErr

然后代码再次退出 if 块,脚本继续其愉快的方式并尝试发送电子邮件。代码中没有任何逻辑可以阻止这种情况。

最后,$emailErr 永远不会被使用,因为代码将用户重定向到另一个不能涉及该变量的 HTML 页面。

解决方案

如果任何验证失败,您需要一些额外的逻辑来告诉代码跳过电子邮件发送部分。巧妙地实现此目的的一种方法非常简单,即使用“标志”变量。

例如:

<?php
require "vendor/autoload.php";

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;

$name = $_POST["name"];
$email = $_POST["email"];
// $email = test_input($_POST["email"]);
$message = $_POST["message"];
$valid = true;
$emailErr = "";

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $emailErr = "Invalid email format";
    $valid = false;
} 

if (!preg_match("/^[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$/", $email)) {
    $emailErr = "Email should contain only letters, numbers, and underscores";
    $valid = false;
}

//only send if all validations passed:
if ($valid == true)
{
  $mail = new PHPMailer(true);

  $mail->SMTPDebug = SMTP::DEBUG_SERVER;

  $mail->isSMTP();
  $mail->SMTPAuth = true;

  $mail->Host = "smtp.gmail.com";
  $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
  $mail->Port = 587;

  require_once 'config.php';
  $mail->Username = SMTP_USERNAME;
  $mail->Password = SMTP_PASSWORD;

  $mail->setFrom($email, $name);
  $mail->addAddress("myemail@gmail.com", "Ads");

  $mail->Subject = $subject;
  $mail->Body =  "Name: $name\nEmail: $email\n\n$message";
  $mail->send();

  header("Location: sent.html");
}
else
{
  echo $emailErr;
}

附注顺便说一句,您的正则表达式限制太多 - 请参阅 允许使用哪些字符在电子邮件地址中?。由于您已经在使用 FILTER_VALIDATE_EMAIL,因此在任何情况下您都不需要它。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板