PHP联系表单提交后重复发送两次邮件,问题排查求助
问题根源
你遇到的重复发邮件问题核心原因有2个:
- contact.php中重复调用了
mail()函数:代码里先无判断执行了一次mail($to, $subject , $body);,后续判断发送状态时又执行了一次!mail($to, $subject, $body),等于每次合法提交都会触发两次邮件发送。 - 潜在问题:表单提交后没有做跳转处理,用户提交后刷新页面会再次触发提交逻辑,也可能导致重复发信;另外当前字段校验逻辑用了
||(或),只要任意一个字段符合要求就会继续执行,不符合常规校验逻辑。 - 额外排查点:你的表单
action属性设置为index.php,需要确认index.php中是否仅有一次引入contact.php的逻辑,不存在重复引入、同时触发前端AJAX提交和后端原生提交的情况。
修复方案
1. 修正contact.php的邮件发送逻辑
仅调用一次mail()函数,用变量存储发送结果再做判断,同时优化校验逻辑和提交后跳转:
<?php error_reporting(0); if(isset($_POST['enviar']) && trim($_POST['email']) !==''){ // 将原来的||替换为&&,要求所有必填项都符合要求才继续 if(!empty(trim($_POST['name'])) && !empty(trim($_POST['subject'])) && !empty(trim($_POST['message'])) && filter_var(trim($_POST['email']), FILTER_VALIDATE_EMAIL)) { $name = strip_tags(htmlspecialchars(trim($_POST['name']))); $email = strip_tags(htmlspecialchars(trim($_POST['email']))); $m_subject = strip_tags(htmlspecialchars(trim($_POST['subject']))); $message = strip_tags(htmlspecialchars(trim($_POST['message']))); $to = "pepito@gmail.com"; $subject = "$m_subject: $name"; $body = "recibiste un nuevo email desde la pagina de Fácil Soft.\n\n"."detalles:\n\nNombre: $name\n\n\nEmail: $email\n\nAsunto: $m_subject\n\nMensaje: $message"; // 仅调用一次mail函数,结果存入变量 $send_status = mail($to, $subject , $body); if(!$send_status) { http_response_code(500); } else { // 发送成功后跳转,避免用户刷新页面重复提交,可替换为你自己的成功页地址 header('Location: index.php?send=success'); } exit(); } } ?>
2. 可选:避免用户重复点击提交按钮
给提交按钮增加点击后禁用的逻辑,防止用户多次点击触发多次提交:
<button class="btn" name="enviar" type="submit" id="sendMessageButton" onClick="this.disabled=true;this.form.submit();clearform();">Enviar mensaje</button>
内容的提问来源于stack exchange,提问作者Martin2236
相关产品推荐
相关产品推荐

