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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:01:06