Node.js调用SendGrid API发送重置密码邮件未收到问题排查
Node.js使用SendGrid发送密码重置邮件,后台记录正常但收不到邮件的排查方案
以下是几个可能遗漏的关键点,按优先级排查:
1. 发件邮箱未完成SendGrid验证
SendGrid强制要求发件地址(域名或单个邮箱)完成验证,否则即使后台显示发送成功,邮件也会被各大邮箱服务商拦截。登录SendGrid后台,进入Sender Authentication页面,确认process.env.EMAIL_FROM对应的邮箱已完成Single Sender Verification,或者其所属域名完成了Domain Authentication。
2. HTML邮件内容格式错误
你的代码中HTML部分存在标签未闭合的问题:
html: `<h1><a href=${link}>click here</h1>`
<a>标签没有闭合</a>,且链接未用双引号包裹,这种不规范的HTML会被邮件客户端判定为风险内容,直接过滤或扔进垃圾箱。修正后的代码:
html: `<h1><a href="${link}">Click here to reset your password</a></h1>`
同时建议在text字段里也带上完整链接,避免HTML渲染失效时用户无法获取重置地址:
text: `Click the link below to reset your password: ${link}`
3. 邮件被收件方邮箱归类到垃圾箱或拦截
- 先检查目标邮箱的垃圾箱、广告邮件文件夹,密码重置类邮件很容易被误判为垃圾邮件;
- 测试发送到不同服务商的邮箱(如Gmail、Outlook、QQ邮箱),确认是否是特定邮箱服务商的过滤规则导致;
- 查看SendGrid的
Email Activity详情,确认事件状态是delivered还是dropped:如果是dropped,查看具体原因(比如收件人邮箱不存在、域名在黑名单、内容触发安全规则)。
4. SendGrid Sandbox模式是否开启
如果SendGrid处于Sandbox模式,所有邮件只会在后台生成记录,不会实际发送到收件邮箱。进入SendGrid后台Settings > Mail Settings,检查Sandbox Mode是否处于关闭状态。
5. 补充错误捕获逻辑
你的代码没有对sgMail.send()添加异常捕获,即使SendGrid返回发送失败的错误,你也无法及时排查。建议添加try-catch:
try { const data = await sgMail.send(msg); return res.send(data); } catch (error) { console.error(error.response?.body || error); return res.status(500).send("Failed to send password reset email"); }
内容的提问来源于stack exchange,提问作者sumanth.js
相关产品推荐
相关产品推荐

