Rumah > Soal Jawab > teks badan
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粉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.