首頁  >  問答  >  主體

為什麼這些輸入驗證不起作用? (透過 PHP & HTML & SMTP 伺服器 & PHPmailer 聯絡我們)

我正在使用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粉613735289P粉613735289432 天前451

全部回覆(1)我來回復

  • P粉924915787

    P粉9249157872023-09-07 13:36:42

    診斷

    如果任一驗證 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,因此在任何情況下您都不需要它。

    回覆
    0
  • 取消回覆