AWS SES邮件未接收问题排查:Lambda触发邮件流程异常
问题:S3触发Lambda发送SES邮件显示成功但收件箱未收到
场景与实现代码
实现流程:文件上传至S3后触发Lambda函数,通过SES发送带附件的邮件。代码如下:
var aws = require("aws-sdk"); var nodemailer = require("nodemailer"); var ses = new aws.SES(); var s3 = new aws.S3(); async function getS3File(bucket, key) { try { const data = await s3.getObject({ Bucket: bucket, Key: key }).promise(); return data; } catch (err) { throw err; } } module.exports.handler = async (event, context, callback) => { try { console.log("event: ", JSON.stringify(event)); const fileData = await getS3File("mh-downtime-rp", "report.csv"); const mailOptions = { from: "xxxx@email1.com", subject: "This is an email sent from a Lambda function!", html: `<p>You got a contact message from: <b>${event.emailAddress}</b></p>`, to: "yyyy@email2.com", attachments: [ { filename: "report.csv", content: fileData.Body, }, ], }; console.log("Creating SES transporter"); const transporter = nodemailer.createTransport({ SES: ses, }); console.log("Sending email"); await transporter.sendMail(mailOptions); console.log("Email sent successfully"); callback(); } catch (err) { console.log(err); console.log("Error sending email"); callback(err); } };
已配置的Lambda角色权限
- AmazonS3FullAccess
- AmazonSESFullAccess
- CloudWatchLogsFullAccess
已完成的验证
已在SES中验证发件人邮箱地址;上传CSV文件至S3后,CloudWatch日志显示Lambda执行成功(输出"Email sent successfully"),但收件人未收到邮件。
排查建议
- 检查SES沙箱模式限制:如果你的SES账户处于沙箱模式,仅能向已在SES中验证过的邮箱发送邮件。确认收件人邮箱是否已完成SES验证,沙箱模式下未验证的收件人无法收到邮件。
- 查看SES投递日志:进入SES控制台,在「邮件发送」模块查看「已发送邮件」列表,检查对应邮件的投递状态,是否存在退回、拒收或被标记为垃圾邮件的记录,里面会给出具体失败原因。
- 排查邮件内容异常:
- 确认
event.emailAddress字段是否存在有效数据,避免HTML渲染异常导致邮件被过滤。可先将HTML内容替换为固定文本(如<p>测试邮件内容</p>)测试。 - 验证附件读取是否正常:在日志中打印
fileData.ContentLength,确认文件大小符合预期,排除S3文件读取异常导致附件损坏。
- 确认
- 检查收件箱垃圾/归档文件夹:很多邮件会被邮箱服务商自动归类到垃圾邮件、归档或其他文件夹,优先排查这些位置。
- 核对邮箱地址格式:确认发件人和收件人邮箱地址无拼写错误,格式符合规范。
- 确认区域一致性:SES是区域性服务,确保Lambda部署的区域与SES配置的区域完全一致,跨区域调用可能导致隐性投递问题。
- 绕过nodemailer直接测试SES API:在Lambda中添加直接调用SES原生
sendEmail方法的代码,排除nodemailer封装层的问题,示例代码:await ses.sendEmail({ Source: "xxxx@email1.com", Destination: { ToAddresses: ["yyyy@email2.com"] }, Message: { Subject: { Data: "SES直接发送测试" }, Body: { Html: { Data: "<p>测试内容</p>" } } } }).promise(); - 检查域名验证与邮件认证:如果使用自定义域名邮箱作为发件人,确认已完成SES域名验证,且配置了正确的DKIM、SPF记录,避免邮件被收件方判定为垃圾邮件。
内容的提问来源于stack exchange,提问作者franco phong
相关产品推荐
相关产品推荐

