Heim > Fragen und Antworten > Hauptteil
Ich verwende PHP, HTML, SMTP-Server und PHPmailer, um ein Kontaktformular mit Benutzereingabevalidierung zu erstellen. Aber nachdem ich auf die Schaltfläche „Senden“ geklickt hatte, wurde mir eine Fehlermeldung angezeigt:
Ungültige Adresse: (Absender): Schwerwiegender Fehler: Nicht abgefangene PHPMailerPHPMailerException: Ungültige Adresse: (von): in C:xampphtdocsRESPONSIVE SITE3_2SupplierphpmailerphpmailersrcPHPMailer.php:1324 Stacktrace: #0 C:xampphtdocsRESPONSIVE SITE3_2send-email.php(74): PHPMailerPHPMailerPHPMailer->setFrom('', '') #1 {main} wirft C:xampphtdocsRESPONSIVE SITE3_2vendorphpmailerphpmailersrcPHPMailer.php Zeile 1324 ein
PHP-Code:
<?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-Code
<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>
Ich habe verschiedene Tutorials ausprobiert – ohne Erfolg. Ich brauche dieses Formular
Ich bin sehr neu in diesem Bereich, bitte erklären Sie es in einer sehr einfachen Sprache :)
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
,因此在任何情况下您都不需要它。