调用Sendgrid Mail Send接口返回202但响应体为空问题排查
Sendgrid Mail Send接口返回202空响应排查及追踪配置指南
202空响应的正常性说明
- Sendgrid v3版本的邮件发送接口默认逻辑为:请求校验通过、邮件进入发送队列后,直接返回
202 Accepted状态码,响应体为空,属于正常表现,不是配置错误。 - 文档中标注的带结构化字段的响应内容,仅在请求时显式要求返回消息标识时才会生成,默认不返回响应体内容。
可用于状态追踪的邮件ID获取方式
要实现点击、回复状态追踪,首先需要拿到每封邮件的唯一标识做业务关联,有两种稳定获取方式:
- 发送请求时在请求头添加
X-Message-ID: true,接口会将当前邮件的唯一追踪ID放在响应头的x-message-id字段中返回,无需依赖响应体 - 使用官方Node.js SDK调用时,直接从返回的response对象的headers属性中读取上述字段即可,空响应体不影响ID获取
点击、回复追踪配置(含Ngrok测试注意事项)
- 点击、打开追踪不需要自行做链路埋点:先在Sendgrid后台追踪设置页开启点击追踪、打开追踪开关,Sendgrid会自动替换邮件内的链接为追踪跳转地址,用户触发点击、打开动作时会自动上报事件
- 回复状态、全链路事件的主动推送需要配置Event Webhook,Ngrok测试时注意以下配置项:
- Ngrok免费版每次启动会生成新的公网域名,重启Ngrok后必须同步更新Sendgrid后台配置的Webhook接收地址
- 勾选需要推送的事件类型,至少包含clicked、replied两类,可根据业务需要额外勾选送达、退信、投诉等事件
- Webhook接口收到Sendgrid推送的事件后,需要在3秒内返回2xx状态码,否则Sendgrid会按策略重复推送,Ngrok默认无额外超时拦截,只要本地服务响应及时即可
- 建议开启Webhook签名校验,避免非法请求伪造事件上报
代码调整参考
email.send({ to: 'temikey@gmail.com', from: 'sam@market.io', // 该发件地址必须对应Sendgrid后台已完成认证的域名,否则邮件可能被拦截或进入垃圾箱 subject: 'Hello world', text: 'Hello plain world!', // 直接在请求内开启追踪,不用全局配置 trackingSettings: { clickTracking: { enable: true, enableText: true // 纯文本邮件内容也开启点击追踪 }, openTracking: { enable: true } }, headers: { 'X-Message-ID': 'true' } }).then(([response, body]) => { console.log('发送状态码:', response.statusCode); const trackMessageId = response.headers['x-message-id']; console.log('邮件追踪ID:', trackMessageId); // 此处可将追踪ID和自身业务的用户、通知记录做绑定,后续收到Webhook事件时做匹配 }).catch(error => { console.error('发送失败详情:', error.response?.body); });
内容的提问来源于stack exchange,提问作者IWI
相关产品推荐
相关产品推荐

