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

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直连,兼容性和可靠性更高。
  • 查看错误日志定位细节
    直接查看服务器错误日志(Apache/NGINX的error.log、PHP的error_log),里面会记录mail()失败的具体原因,比如权限不足、邮件服务器拒绝等。

额外提示

  • 必须添加Webhook验证:你原代码仅定义了验证头但未实际使用,等于没有防护,很容易被伪造请求,一定要加上头信息对比逻辑。
  • 优化邮件内容格式:给邮件添加Content-Type: application/json头,能让收件邮箱正确解析JSON内容,避免显示为乱码或转义字符。

内容的提问来源于stack exchange,提问作者Marek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:56:16