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
相关产品推荐
相关产品推荐

