You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js AWS Lambda函数提示邮件发送成功但收件箱无邮件求助

排查Node.js AWS Lambda + SES邮件发送成功但未收到邮件的问题

这种情况我之前也碰到过,Lambda返回成功但收件箱没收到邮件,大概率是SES配置、权限或者邮件内容的细节问题,咱们一步步来定位:

1. 先确认AWS SES的沙箱模式限制

AWS SES默认处于沙箱模式,这个模式下有严格限制:

  • 只能给已验证的邮箱地址发送邮件,发件人(fromAddress)和收件人(targetAddress)都需要在SES控制台完成验证
  • 每天发送限额很低(默认200封)

看你的config.js配置,先去SES控制台的「已验证身份」板块,确认example@email.com这个发件和收件邮箱都已经通过验证。如果没验证,SES会返回发送成功的响应,但邮件会被直接拦截,根本到不了收件箱。

2. 检查Lambda执行角色的权限

你的Lambda需要两个核心权限:

  • 调用SES发送邮件的权限:给Lambda的IAM角色添加包含ses:SendEmail或ses:SendRawEmail的政策
  • 读取S3模板的权限:添加s3:GetObject权限,允许访问templateBucket和templateKey对应的S3资源

虽然你说函数返回成功,说明S3读取大概率没问题,但还是要确认权限配置是否完整,避免隐性的权限限制。

3. 修复邮件内容的两个关键错误

看你的代码,有两个明显的细节问题会导致邮件异常:

(1)模板占位符未替换

你读取了S3的模板文件,但完全没处理模板里的占位符(比如{{name}}、{{message}}),甚至subject里的{{Lemon}}也原样保留。这种带未替换占位符的内容很容易被反垃圾系统标记,直接扔进垃圾箱或者拦截。

你需要添加占位符替换逻辑,比如:

// 替换subject里的占位符
subject = subject.replace('{{Lemon}}', event.name);
// 替换模板内容里的占位符
message = message.replace('{{name}}', event.name)
                 .replace('{{message}}', event.message);

(2)Reply-To地址格式错误

你代码里的ReplyToAddresses用了HTML实体<和>,这是错误的写法:

ReplyToAddresses: [ event.name + '<' + event.email + '>' ]

SES要求Reply-To地址是标准的邮箱格式,不需要转义,应该改成:

ReplyToAddresses: [ `${event.name} <${event.email}>` ]

转义后的地址SES无法正确解析,会导致邮件处理异常。

4. 查看SES投递日志和CloudWatch细节

Lambda返回成功不代表邮件真的投递到了收件箱,你可以:

  • 去SES控制台的「邮件发送」→「已发送邮件」,找到Lambda日志里输出的MessageId(在ses.sendEmail成功的data里),查看具体投递状态,看是被退回、拦截还是成功投递
  • 启用SES的日志到CloudWatch,能看到更详细的投递过程,比如是不是收件方的反垃圾系统拒绝了邮件

5. 检查收件箱的垃圾邮件和规则

最后别忘了检查收件邮箱的垃圾邮件文件夹,很多时候邮件会被误判为垃圾邮件。另外,看看收件邮箱有没有设置自动归档或删除特定发件地址的规则。

按照这些步骤排查,应该能快速定位到问题所在。

内容的提问来源于stack exchange,提问作者Lemon Kazi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:26:21