Rumah  >  Soal Jawab  >  teks badan

Mengapa pengesahan input ini tidak berfungsi? (Hubungi kami melalui PHP & HTML & SMTP Server & PHPmailer)

Saya menggunakan PHP, HTML, pelayan SMTP dan PHPmailer untuk membuat borang hubungi kami dengan pengesahan input pengguna. Tetapi selepas menekan butang "Hantar", ia memberi saya ralat:

Alamat tidak sah: (Penghantar): Ralat maut: PHPMailerPHPMailerException tidak ditangkap: Alamat tidak sah: (dari): dalam C:xampphtdocsRESPONSIVE SITE3_2SupplierphpmailerphpmailersrcPHPMailer.php:1324 Jejak tindanan: #0 C:xampphtdocsTAPAK RESPONSIF3_2hantar-e-mel.php(74): PHPMailerPHPMailerPHPMailer->setFrom('', '') #1 {main} lontaran dalam C:xampphtdocsTAPAK RESPONSIF3_2vendorphpmailerphpmailersrcPHPMailer.php baris 1324

Kod 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");
?>

Kod 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>

Saya mencuba tutorial yang berbeza - tidak berjaya. Saya perlukan borang ini

Saya sangat baru dalam hal ini, sila jelaskan dalam bahasa yang sangat mudah :)

P粉613735289P粉613735289381 hari yang lalu411

membalas semua(1)saya akan balas

  • P粉924915787

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

    Diagnosis

    Jika sama ada pengesahan if 语句为 true,则将设置一个字符串变量 $emailErr.

    Kemudian kod itu keluar dari blok if sekali lagi dan skrip meneruskan dengan riangnya dan cuba menghantar e-mel. Tiada logik dalam kod untuk menghalang ini.

    Akhir sekali, $emailErr tidak pernah digunakan kerana kod tersebut mengubah hala pengguna ke halaman HTML lain yang tidak boleh melibatkan pembolehubah itu.

    Penyelesaian

    Jika sebarang pengesahan gagal, anda memerlukan beberapa logik tambahan untuk memberitahu kod supaya melangkau bahagian penghantaran e-mel. Cara yang sangat mudah untuk melakukan ini dengan bijak ialah menggunakan pembolehubah "bendera".

    Contohnya:

    <?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;
    }

    P.S. BTW, regex anda terlalu ketat - lihat Apakah aksara yang dibenarkan dalam alamat e-mel? . Memandangkan anda sudah menggunakan FILTER_VALIDATE_EMAIL, anda tidak memerlukannya dalam apa jua keadaan.

    balas
    0
  • Batalbalas