You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP mailer发送重复邮件问题:牙医预约表单多次发信如何排查

问题根因

  • 最核心的问题是你的代码中重复调用了mail()发送函数:
    1. 处理表单逻辑时你先主动调用了一次mail('email@here.com',$subject,$message,$headers);直接发送了第一封邮件
    2. 后续判断发送结果时,你又调用了一次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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:39:04