PHP mailer发送重复邮件问题:牙医预约表单多次发信如何排查
问题根因
- 最核心的问题是你的代码中重复调用了
mail()发送函数:- 处理表单逻辑时你先主动调用了一次
mail('email@here.com',$subject,$message,$headers);直接发送了第一封邮件 - 后续判断发送结果时,你又调用了一次
mail($subject,$message,$headers),哪怕参数缺失(少了第一个收件人参数),只要发送逻辑执行就会再次触发邮件发送,这就直接导致单次提交至少发2封
- 处理表单逻辑时你先主动调用了一次
- 附加问题:判断逻辑写反了,
mail()函数执行成功返回true,你现在的代码是发送成功反而提示"something went wrong",发送失败才提示成功 - 额外触发场景:如果前端没有做按钮提交后禁用的逻辑,用户误点多次按钮、或者页面刷新重复提交POST请求,都会进一步增加邮件发送次数
修复方案
1. 修正后端邮件发送逻辑
移除重复的mail()调用,补全参数、修正判断逻辑,同时增加防重复提交的Session校验,修改后代码如下:
<?php session_start(); // 开启session用于防重复提交 ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); /* require 'PHPMailer/PHPMailerAutoload.php'; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; */ if(isset($_POST['submit'])){ // 防重复提交校验:如果session里有提交标记,直接跳过处理 if (isset($_SESSION['form_submitted']) && $_SESSION['form_submitted'] === true) { echo "<h3>请勿重复提交表单</h3>"; exit; } // 接收POST数据 $name = stripcslashes($_POST['name']); $phone = stripcslashes($_POST['phone']); $email = stripcslashes($_POST['email']); $message = stripcslashes($_POST['message']); $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n"; $headers .= 'From: <email@here.com>' . "\r\n"; $subject = "Afspraak aanvraag van: " . $name; $content = "Naam: " . $name . "<br /><br />Email: " . $email. "<br /><br />Telefoon: " . $phone. "<br /><br />Bericht: " . $message . ""; // 只调用一次mail发送,接收返回结果 $send_result = mail('email@here.com',$subject,$content,$headers); if(!$send_result) { echo "<h3>Sorry, something went wrong.</h3>"; } else { // 发送成功打标记,防止刷新重复提交 $_SESSION['form_submitted'] = true; // 可选优化:直接跳转到成功页,用PRG模式彻底避免重复提交 // header('Location: /success.html'); // exit; echo "<h3>Thanks for your message <br></h3>"; } /* // SMTP Configuration XXXXXX // $mail->Body = 'This is the HTML message body <b>in bold!</b>'; // $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test $mail->MsgHTML("Name:" . $name . "<br /><br />Email:" . $email. "<br /><br />Phone:" . $phone. "<br /><br />Messgae:" . $message); if (!$mail->send()) { echo 'Mailer Error: ' . $mail->ErrorInfo; } else { echo 'Message sent!'; } */ } ?>
2. 前端补充防重复提交逻辑
给表单提交按钮添加点击后禁用的逻辑,示例代码如下:
<form method="post" onsubmit="document.getElementById('submit-btn').disabled = true;"> <!-- 其他表单字段 --> <button type="submit" id="submit-btn" name="submit">提交预约</button> </form>
内容的提问来源于stack exchange,提问作者Famke
相关产品推荐
相关产品推荐

