Maison > Questions et réponses > le corps du texte
J'utilise PHP, HTML, serveur SMTP et PHPmailer pour créer un formulaire de contact avec validation des entrées utilisateur. Mais après avoir appuyé sur le bouton "Soumettre", cela m'a donné une erreur :
Adresse invalide : (Expéditeur) : Erreur fatale : PHPMailerPHPMailerException non intercepté : adresse invalide : (de ): dans C:xampphtdocsRESPONSIVE SITE3_2FournisseurphpmailerphpmailersrcPHPMailer.php:1324 Trace de la pile: #0 C:xampphtdocsRESPONSIVE SITE3_2send-email.php(74): PHPMailerPHPMailerPHPMailer->setFrom('', '') #1 {main} lance C:xampphtdocsRESPONSIVE SITE3_2vendorphpmailerphpmailersrcPHPMailer.php ligne 1324
Code 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"); ?>
Code 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>
J'ai essayé différents tutoriels - sans succès. J'ai besoin de ce formulaire
Je suis très nouveau dans ce domaine, veuillez l'expliquer dans un langage très simple :)
P粉9249157872023-09-07 13:36:42
Diagnostic
Si soit vérification if
语句为 true,则将设置一个字符串变量 $emailErr
.
Ensuite, le code sort à nouveau du bloc if
et le script continue son bon chemin et tente d'envoyer l'e-mail. Il n'y a aucune logique dans le code pour empêcher cela.
Enfin, $emailErr
n'est jamais utilisé car le code redirige l'utilisateur vers une autre page HTML qui ne peut pas impliquer cette variable.
Solution
Si une validation échoue, vous avez besoin d'une logique supplémentaire pour indiquer au code d'ignorer la partie d'envoi d'e-mail. Un moyen très simple de procéder intelligemment consiste à utiliser une variable « flag ».
Par exemple :
<?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, votre regex est trop restrictive - voir Quels caractères sont autorisés dans les adresses e-mail ? . Puisque vous utilisez déjà FILTER_VALIDATE_EMAIL
, vous n’en avez en aucun cas besoin.