PHP接收Webhook并邮件推送故障排查请求
Webhook邮件发送故障排查与修复
核心问题分析与解决步骤
- 邮件头混淆+未传入关键参数
你当前代码把Webhook的验证头直接赋值给$headers还覆盖了一次,关键是调用mail()时根本没传这个参数,而且Webhook的头和邮件头完全是两回事。
正确做法:将Webhook验证逻辑与邮件头分开,给邮件设置正确的MIME头(避免JSON内容乱码),并传入mail()的第四个参数。
修正后的代码:<?php // 定义Webhook预期的验证信息 $expectedEvent = "product.update"; $expectedSecret = "my_key"; // 获取请求中的实际头信息 $requestEvent = $_SERVER['HTTP_X_EVENT_NAME'] ?? ''; $requestSecret = $_SERVER['HTTP_X_EVENT_SECRET'] ?? ''; // 验证Webhook合法性(必须添加,防止恶意请求) if ($requestEvent !== $expectedEvent || $requestSecret !== $expectedSecret) { http_response_code(403); exit; } $json = file_get_contents("php://input"); file_put_contents('log.txt', "$json", FILE_APPEND | LOCK_EX); // 设置邮件头,确保JSON内容正常显示 $mailHeaders = "MIME-Version: 1.0\r\n"; $mailHeaders .= "Content-Type: application/json; charset=utf-8\r\n"; // 调用mail函数并传入头参数 mail("my@email.eu", "NEW MSG", $json, $mailHeaders); http_response_code(204); - 服务器邮件服务未配置
多数服务器默认未开启或配置sendmail/SMTP服务,原生mail()函数依赖本地邮件服务,未配置就会发送失败。你可以:- 检查php.ini里的
sendmail_path(Linux系统)或SMTP相关参数(Windows系统)是否正确配置; - 虚拟主机环境建议用PHPMailer替代原生
mail(),它支持SMTP直连,兼容性和可靠性更高。
- 检查php.ini里的
- 查看错误日志定位细节
直接查看服务器错误日志(Apache/NGINX的error.log、PHP的error_log),里面会记录mail()失败的具体原因,比如权限不足、邮件服务器拒绝等。
额外提示
- 必须添加Webhook验证:你原代码仅定义了验证头但未实际使用,等于没有防护,很容易被伪造请求,一定要加上头信息对比逻辑。
- 优化邮件内容格式:给邮件添加
Content-Type: application/json头,能让收件邮箱正确解析JSON内容,避免显示为乱码或转义字符。
内容的提问来源于stack exchange,提问作者Marek
相关产品推荐
相关产品推荐

