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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:17:10