使用Mailgun.js发送博客新闻通讯时触发401未授权错误求助
问题分析与解决方案
核心问题
基于Next.js + Sanity搭建的博客,集成Mailgun新闻通讯功能时,订阅流程正常,但发送邮件时触发401 Unauthorized错误,已尝试多类调试手段仍未解决,怀疑与越南.vn后缀域名有关。
针对性排查与修复步骤
1. 确认Mailgun域名权限与区域匹配
- 核实Mailgun是否支持.vn顶级域名的发送权限,部分区域域名可能存在合规限制,可直接联系Mailgun客服确认域名准入状态。
- 严格匹配API端点与账号区域:若账号注册在欧盟区,必须使用
https://api.eu.mailgun.net/,同时确保域名归属区域与API端点一致,避免跨区域调用导致权限校验失败。
2. 密钥与认证格式精准校验
- 区分两类密钥的使用场景:
- Domain Sending API Key:仅用于对应域名下的邮件发送,格式为
key-xxxxxx,需直接以完整格式传入请求头,无需额外拼接前缀。 - Mailgun API Key:全局账号密钥,权限覆盖账号级操作,但发送邮件必须使用Domain Sending API Key。
- Domain Sending API Key:仅用于对应域名下的邮件发送,格式为
- 环境变量配置注意:
- 无需添加
NEXT_PUBLIC_前缀,Mailgun密钥属于敏感信息,仅在服务端通过process.env.MAILGUN_API_KEY调用即可。 - 确保
.env.local文件放置在Next.js项目根目录,且重启开发服务器使变量生效,避免缓存导致的变量未加载。
- 无需添加
3. IP访问控制细节检查
- 若开启Mailgun的IP访问管理,需添加Next.js服务的公网IP(生产环境)或ngrok的转发IP(开发环境),而非ngrok的Web Interface IP(仅用于隧道管理,不参与API请求)。
- 临时关闭IP访问控制进行测试,排除白名单配置错误的可能。
4. 请求头与格式规范验证
- 发送邮件请求必须使用Basic Auth认证,将
api:${YOUR_DOMAIN_KEY}进行Base64编码后放入Authorization头,示例代码:const auth = Buffer.from(`api:${process.env.MAILGUN_DOMAIN_KEY}`).toString('base64'); const response = await fetch('https://api.eu.mailgun.net/v3/YOUR_DOMAIN/messages', { method: 'POST', headers: { 'Authorization': `Basic ${auth}`, 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ from: 'Your Blog <newsletter@your-domain.vn>', to: 'subscriber@example.com', subject: 'Latest Updates', text: 'Your newsletter content here' }) }); - 确保请求体中
from地址与Mailgun验证的域名完全匹配,禁止使用未验证的邮箱后缀。
5. 沙箱域名完整测试流程
- 使用Mailgun沙箱域名时,仅能发送至账号内已验证的测试邮箱,无法发送到任意邮箱,否则会触发权限错误。
- 沙箱域名的API密钥需单独获取,与正式域名密钥不同,需确认是否使用正确。
最终验证建议
若以上步骤均无效,可直接使用Mailgun控制台内的官方API测试工具发送测试邮件:若同样报错,可确认是账号或域名权限问题;若测试成功,则问题出在Next.js服务端的请求代码或环境配置上。
内容的提问来源于stack exchange,提问作者Long Dang
相关产品推荐
相关产品推荐

