Mailjet Node.js发邮件返回成功但未收到 查询消息返回404
问题原因
你碰到的404错误基本是以下原因导致的:
- 接口同步延迟:v3.1版本的send接口返回200状态,仅代表Mailjet服务端成功接收了你的发信请求、将邮件放入了投递队列,不代表邮件元数据已经同步到可供REST接口查询的数据库中。刚拿到返回的MessageID立刻发起查询,大概率会碰到数据未同步的问题,常规延迟在1030秒,服务高峰期可能延长到12分钟。
- 鉴权缺失/错误:Mailjet的消息查询接口不会对未携带合法鉴权信息的请求返回“未授权”类提示,统一返回404 Object not found,避免恶意用户枚举有效MessageID。如果你是直接把查询URL粘贴到浏览器地址栏访问、或者查询请求没带和发信时一致的Basic Auth鉴权头,哪怕MessageID真实存在也会返回404。
- 少数情况是发信和查询使用的API密钥不匹配:比如发信用的是子账号/沙箱环境密钥,查询时用了主账号/生产环境密钥,跨权限/跨环境的查询也会返回对象不存在。
排查&解决方法
- 拿到send接口返回的MessageID后,等待至少30秒再发起查询请求,不要在发信逻辑里同步调用查询接口
- 确认查询请求携带正确的Basic Auth鉴权:鉴权用户名对应
MAILJET_API_KEY,密码对应MAILJET_API_SECRET,和初始化Mailjet客户端使用的密钥完全一致,不要直接在无鉴权的浏览器中打开查询链接 - 如果等待超过5分钟仍返回404,核对发信、查询两个环节使用的密钥是否属于同一账号、同一环境,不要混用主账号/子账号、生产/测试环境的密钥
- 生产环境建议直接配置Mailjet的事件回调Webhook接收邮件投递状态,比主动轮询查询接口更实时,也不需要处理数据同步延迟问题
另外你的发信函数里有冗余的Promise包装:mailjetTransporter.request()本身就返回Promise,不需要额外套一层new Promise,不仅多余还容易导致异常捕获遗漏,可简化为如下写法:
const Mailjet = require('node-mailjet'); const sendEmail = async (to, topic, content) => { const mailjetTransporter = new Mailjet({ apiKey: process.env.MAILJET_API_KEY, apiSecret: process.env.MAILJET_API_SECRET, }); return mailjetTransporter .post('send', { version: 'v3.1' }) .request({ Messages: [ { From: { Email: process.env.SMTP_FROM_EMAIL, Name: process.env.SMTP_FROM_NAME }, To: to, Subject: topic, TextPart: topic, HTMLPart: content } ] }); }
内容的提问来源于stack exchange,提问作者DWSapp
相关产品推荐
相关产品推荐

