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

PHP+Mandrill发邮件遇预检请求问题:邮件重复发送且首次无请求值

问题分析与解决方案

核心问题原因

你的代码中对OPTIONS请求的判断使用了HTML转义后的引号实体"OPTIONS",这会导致PHP无法正确识别预检请求,使得OPTIONS请求直接进入业务逻辑分支(else部分),触发第一次无参数的邮件发送。之后浏览器会正常发送实际业务请求(如POST),再次执行邮件发送逻辑,最终造成邮件发送两次、第一次无参数的问题。

修复步骤

  1. 修正OPTIONS请求判断
    将代码中的$method == "OPTIONS"替换为正确的PHP字符串判断:

    if ($method == "OPTIONS") {
    

    确保预检请求能被正确捕获,仅返回CORS头并终止脚本,不执行任何业务逻辑。

  2. 确保业务请求正确获取参数
    如果前端发送的是JSON格式的请求体,PHP的$_POST无法直接获取参数,需要通过file_get_contents('php://input')解析:

    // 在else分支开头添加参数解析逻辑
    $requestData = json_decode(file_get_contents('php://input'), true);
    // 确保解析成功再继续后续逻辑
    if (!$requestData) {
        throw new Exception('Invalid request data');
    }
    

    之后将$requestData传入相关业务方法(如get_mandril_request_data)。

  3. 优化CORS头配置
    你的CORS头配置可优化为更简洁的写法,同时确保非OPTIONS请求也能返回跨域允许头(如果有跨域需求):

    if ($method == "OPTIONS") {
        header('Access-Control-Allow-Origin: *');
        header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Authorization");
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
        header("HTTP/1.1 200 OK");
        exit;
    } else {
        // 非OPTIONS请求也返回允许跨域的头
        header('Access-Control-Allow-Origin: *');
        // 后续业务逻辑...
    }
    

额外检查

  • 确认前端没有重复发送请求的逻辑,比如误触发两次API调用。
  • 查看Mandrill的发送日志,确认两次请求的来源,验证修复效果。

内容的提问来源于stack exchange,提问作者Filip Vnenčák

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:45:43