Mengapa pengesahan input ini tidak berfungsi? (Hubungi kami melalui PHP & HTML & SMTP Server & PHPmailer)
P粉613735289
P粉613735289 2023-09-06 21:34:49
0
1
483

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

  • Sahkan input pengguna, hanya benarkan nombor dan huruf dimasukkan (medan mel)
  • Jika data tidak sah, mesej ralat mesti muncul di bawah medan input

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

P粉613735289
P粉613735289

membalas semua(1)
P粉924915787

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan