AWS SES sendRawEmail调用卡顿超时问题求助(Node.js)
解决AWS SES sendRawEmail调用超时问题
看起来你遇到的是AWS SES sendRawEmail 调用超时的典型问题——之前能成功发送,后来突然卡顿超时,大概率不是代码基础逻辑的问题,而是环境或配置层面的坑。我整理了几个高概率的排查方向和解决方案,你可以逐一试试:
1. 检查AWS SDK版本与运行时兼容性
你代码里直接用require('aws-sdk'),如果是在Lambda环境运行,默认的SDK版本可能比较老旧,和当前Node.js运行时(比如Node.js 18+)存在兼容性问题,导致请求卡住。
- 解决方案:
- 升级项目中的AWS SDK到最新稳定版,执行命令:
npm install aws-sdk@latest --save - 如果是Lambda函数,建议把SDK打包进部署包,不要依赖Lambda默认的旧版本,重新部署后再测试。
- 升级项目中的AWS SDK到最新稳定版,执行命令:
2. 排查Lambda的VPC网络配置
如果你的Lambda函数配置了VPC,那SES的API请求可能无法正常走出VPC,直接导致超时:
- SES是AWS托管的公网服务,Lambda在VPC内默认无法直接访问SES的公网端点,除非你的VPC配置了NAT网关(私有子网场景)或互联网网关(公有子网),且安全组允许出站HTTPS请求。
- 解决方案:
- 若不需要Lambda在VPC内访问其他资源,直接移除Lambda的VPC配置,让它回到默认公共网络环境,就能正常调用SES了。
- 若必须保留VPC,需确保VPC有可用的NAT/互联网网关,同时安全组出站规则允许
443端口的HTTPS请求到SES服务端点。
3. 检查SES的发送限制与账户状态
SES有严格的发送配额和速率限制,一旦发送量超限或账户触发合规预警,可能会导致请求被限流甚至挂起:
- 登录AWS控制台进入SES服务,查看发送统计和账户状态:
- 确认是否达到24小时发送配额上限
- 检查是否有退信/投诉率过高的情况,这会直接限制你的发送权限
- 如果是配额问题,可以申请提高发送限额;如果是合规问题,先处理退信和投诉,再联系AWS支持解除限制。
4. 优化sendRawEmail的请求格式
你手动拼接的原始邮件格式可能存在隐性语法错误,一开始侥幸通过,但后续SES的校验逻辑变严格后,就会导致请求卡住:
- 原始邮件必须严格遵循RFC 5322标准,比如
From字段的格式、换行必须用\r\n而非\n,否则SES可能在解析时无限等待。 - 建议用成熟的邮件库生成原始内容,比如
nodemailer配合nodemailer-ses-transport,避免手动拼接的格式问题:const nodemailer = require('nodemailer'); const sesTransport = require('nodemailer-ses-transport'); const transporter = nodemailer.createTransport(sesTransport({ accessKeyId: 'YOUR_ACCESS_KEY', secretAccessKey: 'YOUR_SECRET_KEY', region: 'YOUR_REGION' })); transporter.sendMail({ from: "'Service Monitor' <your-from-email@example.com>", to: 'recipient@example.com', subject: 'Status Update', text: JSON.stringify(statusJSON) }, (error, info) => { if (error) { console.error('Send error:', error); } else { console.log('Email sent:', info); } });
5. 给SES客户端显式设置请求超时
你已经增加了Lambda的超时时间,但可能没给AWS SDK的请求单独设置超时,导致请求无限等待:
- 初始化SES客户端时,显式设置请求超时,比Lambda的60秒短,提前触发错误便于排查:
var ses = new aws.SES({ region: 'YOUR_REGION', httpOptions: { timeout: 30000 // 30秒超时 } });
内容的提问来源于stack exchange,提问作者Abhijeet Kale
相关产品推荐
相关产品推荐

