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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:22:47