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

Mailgun发送API本地正常,部署Cloudflare Pages遇Bad Request错误求助

排查Cloudflare Pages部署后Mailgun Bad Request错误的建议

以下是针对你遇到问题的具体排查方向:

  • 验证Cloudflare环境变量配置
    确保Cloudflare Pages后台配置的MG_SENDING_API、MAIL_SERVER、INQUIRY_INBOX这几个服务器端环境变量完全正确:

    • 检查变量值是否有多余空格、大小写错误(比如API key的大小写是否和Mailgun后台一致)
    • 确认这些变量是配置在Server Environment Variables下,而非客户端变量,因为astro:env/server只会读取服务器端的环境变量
  • 检查Mailgun请求参数的合法性

    • 发件人地址:relay@${MAIL_SERVER}必须是Mailgun后台已验证的域名或发件地址,未验证的发件人会被Mailgun拒绝。可以登录Mailgun后台,检查对应域名的验证状态(DKIM、SPF记录是否生效)
    • 收件人地址:如果使用Mailgun免费套餐,收件人必须是已添加到Mailgun后台的验证地址,否则会触发Bad Request
    • HTML内容:临时把html字段换成固定的简单内容(比如<h5>Inquiry:</h5> <p>Test Content</p>),排除用户提交的msg包含未转义特殊字符(如引号、未闭合标签)导致的格式错误
  • 增强错误日志获取具体原因
    修改catch块的日志代码,打印更详细的错误信息,Mailgun的Bad Request通常会返回具体的错误描述:

    catch (err: any) {
      console.error('Mailgun请求错误:', err.message);
      // 打印Mailgun返回的详细错误数据(如果存在)
      if (err.response?.data) {
        console.error('错误详情:', JSON.stringify(err.response.data));
      }
    }
    

    查看Cloudflare Pages的Functions日志,就能知道是参数错误、权限问题还是其他具体原因

  • 绕过mailgun.js客户端,直接用Fetch调用API
    可能mailgun.js在Cloudflare Workers环境下存在兼容问题,试试直接用原生Fetch调用Mailgun REST API:

    try {
      const auth = btoa(`api:${MG_SENDING_API}`);
      const response = await fetch(`https://api.mailgun.net/v3/${MAIL_SERVER}/messages`, {
        method: 'POST',
        headers: {
          'Authorization': `Basic ${auth}`,
          'Content-Type': 'application/x-www-form-urlencoded',
        },
        body: new URLSearchParams({
          from: `Inquiry <relay@${MAIL_SERVER}>`,
          to: INQUIRY_INBOX,
          subject: "New Inquiry",
          html: "<h5>Inquiry:</h5> <p>Test</p>"
        })
      });
    
      if (!response.ok) {
        const errorData = await response.json();
        throw new Error(`Mailgun API错误: ${JSON.stringify(errorData)}`);
      }
    
      const result = await response.json();
      console.log('邮件发送成功:', result);
    } catch (err) {
      console.error(err);
    }
    

    如果这种方式能成功,说明是mailgun.js的适配问题,可以继续用原生Fetch或者调整mailgun.js的初始化方式

  • 检查Cloudflare网络限制
    确认Cloudflare Pages没有拦截到Mailgun API的请求,Mailgun的API域名是api.mailgun.net,可以在代码中打印请求的完整URL和参数,确认请求能正常发送到该域名

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 20:52:39