使用SendGrid+PHP发送邮件为何收到重复邮件?
解决SendGrid PHP发送重复邮件的问题
以下是针对你遇到的重复发送邮件问题的排查方向和解决方法:
1. 修复header跳转前的输出问题
你的代码在发送邮件后执行了print输出,这会导致后续的header()跳转无法正常生效(HTTP头必须在任何内容输出之前发送)。如果服务器未开启输出缓冲,PHP会抛出警告,页面无法跳转,用户可能误以为提交失败而重复操作,最终触发两次邮件发送。
修改代码:
移除发送后的print语句,改用日志记录状态,确保header正常跳转:
function sendEmaill(){ $email = new \SendGrid\Mail\Mail(); $email->setFrom("xxxx@yyyyy.com", "Testing"); $email->setSubject("Your Registration is confirmed"); $email->addTo("aaaaa@bbbbbbb.com", "Test"); $email->addContent("text/plain", "Your Registration for X is confirmed"); $email->addContent( "text/html", "<strong>If you have any questions please contact XXXXX</strong>" ); $apiKey = "XXXXXXXXXXXXXXXXXX"; // Replace with your actual SendGrid API key $sendgrid = new \SendGrid($apiKey); try { $response = $sendgrid->send($email); // 用日志记录状态,避免输出内容影响header跳转 error_log('SendGrid邮件发送状态码: ' . $response->statusCode()); } catch (Exception $e) { error_log('SendGrid邮件发送失败: ' . $e->getMessage()); } header("Location: /account/registration/index.php?c=123"); exit(); }
2. 确认函数仅被调用一次
- 检查调用
sendEmaill()的代码位置,确认没有重复执行的逻辑(比如表单提交处理中,是否存在两次条件判断触发该函数)。 - 注意你的函数名是
sendEmaill(末尾三个l),确保没有因拼写错误导致的意外调用(比如误写函数名后重复定义或调用)。
3. 前端添加防重复提交措施
用户多次点击提交按钮是常见的重复触发原因,在前端页面添加限制:
- 提交按钮点击后立即禁用:
document.querySelector('form').addEventListener('submit', function(e) { const submitBtn = this.querySelector('button[type="submit"]'); submitBtn.disabled = true; submitBtn.textContent = '提交中...'; });
- 或者使用CSRF令牌,后端验证请求的唯一性,拒绝重复提交的请求。
4. 检查SendGrid后台的邮件记录
登录SendGrid控制台,查看「邮件活动」页面:
- 如果显示同一时间有两次发送请求,说明问题出在代码或请求端;
- 如果仅显示一次请求但发送了两封邮件,可能是SendGrid端的配置问题,需要联系SendGrid技术支持排查。
5. 排查服务器端的请求重试机制
部分服务器或反向代理(如Nginx)在未收到正确响应时会自动重试请求,检查服务器日志,确认是否存在重复的请求记录。如果是,需要确保你的代码能正确返回200状态码,避免触发重试。
内容的提问来源于stack exchange,提问作者user3826864
相关产品推荐
相关产品推荐

