Next.js项目用AWS SES+Nodemailer时,生产环境无报错无退信但邮件无法投递求助
生产环境Next.js + AWS SES 发信无报错无投递排查方案
已知问题基础信息
- 开发环境(含Vercel Dev CLI模拟生产环境的本地测试)全流程正常,发信可即时送达,无任何报错
- 生产环境部署后,提交联系表单触发
/api/nodemailer路由发信时,全链路无可见异常:- AWS SES控制台无对应发信、退信记录
- 生产Serverless函数日志、本地开发控制台无任何报错堆栈
- 邮件始终无法实际投递到目标收件地址
- 已完成常规校验:生产环境变量配置准确性、SES域名绑定的DNS解析记录、发信所用IAM策略的全访问权限配置
- 关联代码文件:
- 客户端表单组件:
@components/Portals/nodemail.tsx - 后端发信API路由:
pages/api/nodemailer.ts
- 客户端表单组件:
分层排查步骤
1. 验证API路由的请求可达性
- 在
/api/nodemailer路由的最入口处添加无敏感信息的埋点日志,记录请求触发时间、入参结构、当前进程可读取的环境变量键名集合- 若生产环境提交表单后无对应埋点日志:排查前端表单的请求路径与生产环境路由规则的匹配性,检查是否存在平台路由重写、边缘缓存规则拦截了目标请求
- 若埋点日志正常输出:进入下一层定位
2. 定位Nodemailer执行链路的静默中断点
- 在Nodemailer实例初始化位置、
sendMail方法调用前后分别添加埋点,打印实际使用的SES地域、凭证加载状态、sendMail方法的完整返回结果(含messageId、AWS响应体) - 重点排查两类易被忽略的静默异常:
- Vercel Serverless函数冷启动时,顶层作用域读取的环境变量可能因加载时序为空,代码未做空值校验的情况下,Nodemailer会使用空凭证初始化,异步发信请求在未发起对AWS的HTTPS调用时就因内部错误静默中断,全程不抛出可被捕获的异常
- 代码中若未将
sendMail的Promise错误捕获逻辑放在异步等待链路中,上游的函数执行超时会直接中断进程,不会把发信错误写入日志
3. 校验前端交互的真实响应结果
- 打开线上联系页的开发者工具网络面板,查看表单提交时
/api/nodemailer请求的实际状态码、响应体:- 若响应为平台兜底的200状态,但和后端代码预设的成功响应结构不一致:说明函数执行被平台层拦截,未真正走到业务逻辑
- 若响应结构和代码预设一致但日志无发信记录:继续排查网络层的请求拦截问题
4. 排除SES侧的隐性配置问题
- 核对当前发信域名对应的SES服务地域,确认Nodemailer初始化时配置的地域和控制台域名所属地域完全一致,跨地域调用时部分请求会被网络层直接丢弃,不生成控制台日志
- 确认SES的沙箱模式状态:若域名完成验证但未申请退出沙箱,向非验证收件地址发信时,部分请求不会在控制台生成完整记录,仅在底层SMTP交互日志中留存零散条目
- 检查Vercel生产环境的出站网络出口IP,确认未被AWS侧的访问策略静默拦截
内容的提问来源于stack exchange,提问作者Andrew Ross
相关产品推荐
相关产品推荐

