PHP+Mandrill发邮件遇预检请求问题:邮件重复发送且首次无请求值
问题分析与解决方案
核心问题原因
你的代码中对OPTIONS请求的判断使用了HTML转义后的引号实体"OPTIONS",这会导致PHP无法正确识别预检请求,使得OPTIONS请求直接进入业务逻辑分支(else部分),触发第一次无参数的邮件发送。之后浏览器会正常发送实际业务请求(如POST),再次执行邮件发送逻辑,最终造成邮件发送两次、第一次无参数的问题。
修复步骤
修正OPTIONS请求判断
将代码中的$method == "OPTIONS"替换为正确的PHP字符串判断:if ($method == "OPTIONS") {确保预检请求能被正确捕获,仅返回CORS头并终止脚本,不执行任何业务逻辑。
确保业务请求正确获取参数
如果前端发送的是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)。优化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
相关产品推荐
相关产品推荐

