使用NestJS调用AWS SES发邮件时遇InvalidClientTokenId错误求助
排查AWS SES发送邮件时的InvalidClientTokenId错误
问题背景
调用AWS SES发送邮件时触发以下错误:
InvalidClientTokenId: The security token included in the request is invalid
同时代码存在一个潜在问题:模板文件为EJS格式(welcome.ejs),但代码中使用Handlebars.compile编译,会导致模板变量无法正确渲染。
可能的原因及解决办法
1. 凭证本身无效或配置错误
- 排查点:
- 核对
accessKeyId和secretAccessKey是否完全匹配AWS控制台IAM用户的安全凭证,注意不要包含多余空格、换行符,密钥区分大小写。 - 检查IAM用户的访问密钥是否已激活、未被删除或过期(在IAM控制台→用户→安全凭证→访问密钥中查看状态)。
- 核对
- 解决办法:
- 重新生成并复制正确的访问密钥,替换代码中的占位符。
- 确保密钥状态为"活跃",若已过期则生成新密钥。
2. IAM用户缺少SES权限
- 排查点:
- 该IAM用户是否被授予发送邮件的权限(
ses:SendEmail或ses:SendRawEmail)。
- 该IAM用户是否被授予发送邮件的权限(
- 解决办法:
- 在IAM控制台为用户附加
AmazonSESFullAccess政策(适合测试环境),或创建自定义政策仅授予必要权限:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["ses:SendEmail", "ses:SendRawEmail"], "Resource": "*" } ] }
- 在IAM控制台为用户附加
3. AWS区域不匹配或SES未在该区域启用
- 排查点:
- 代码中指定区域为
eu-west-1,确认AWS SES是否已在该区域启用(新账户默认仅在us-east-1启用,需手动开通其他区域)。 - 确保IAM用户的权限政策允许在
eu-west-1区域访问SES服务。
- 代码中指定区域为
- 解决办法:
- 在AWS SES控制台的区域选择器中切换到
eu-west-1,确认服务已启用;若未启用,按照提示完成开通流程。 - 若不需要
eu-west-1,可将代码中的区域改为已启用SES的区域(如us-east-1)。
- 在AWS SES控制台的区域选择器中切换到
4. AWS SDK优先加载了其他凭证来源
- 排查点:
- AWS SDK按优先级加载凭证:环境变量 > 共享配置文件(
~/.aws/credentials) > IAM角色 > 代码硬编码。如果环境变量或配置文件中存在无效凭证,会覆盖代码中的设置。
- AWS SDK按优先级加载凭证:环境变量 > 共享配置文件(
- 解决办法:
- 移除代码中的硬编码凭证,改用环境变量加载,更安全且避免冲突:
const config = { accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, region: process.env.AWS_REGION || 'eu-west-1', }; - 检查系统环境变量或
~/.aws/credentials文件中的凭证是否正确,若有无效项可暂时移除或修改。
- 移除代码中的硬编码凭证,改用环境变量加载,更安全且避免冲突:
5. 模板编译错误(潜在问题)
- 排查点:
- 模板使用EJS语法(
<%= variable %>),但代码用Handlebars编译,会导致模板变量无法解析,邮件内容显示原始标签。
- 模板使用EJS语法(
- 解决办法:
- 安装EJS依赖:
npm install ejs - 修改代码中的编译逻辑为EJS:
import ejs from 'ejs'; // ... const emailTemplate = ejs.compile(emailTemplateSource); const html = emailTemplate(data);
- 安装EJS依赖:
内容的提问来源于stack exchange,提问作者Happy Patel
相关产品推荐
相关产品推荐

