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

AWS Lambda中SES异步调用失效问题排查求助

问题排查与修复方案

核心问题分析

你的代码存在三个关键问题,直接导致邮件发送不稳定:

  1. response对象的JSON语法错误
    原response的body字段末尾多了一个多余的双引号,虽然可能没触发运行时错误,但会导致返回的JSON格式无效,客户端可能解析失败。

  2. 异步操作未正确等待
    sendEmail函数中调用ses.sendEmail(params).promise()后,既没有等待Promise完成,也没有调用传入的done回调。而你的handler是async函数,却直接return response,Lambda会在sendEmail的异步请求完成前就终止执行——这就是大部分情况下邮件发送失败的根本原因:请求还没发送完成就被Lambda掐断了。

  3. 回调与async/await混用导致逻辑混乱
    handler使用了async声明,但内部又混用传统回调函数,两种异步模式叠加导致流程控制完全失效。


修正后的代码

var AWS = require('aws-sdk');
var ses = new AWS.SES({ region: "us-east-1"});
var RECEIVER = 'example@email.com';
var SENDER = 'example@email.com';

// 修正JSON语法错误的response对象
var response = {
    "statusCode": 200,
    "headers": { 
        "Content-Type": "application/json",
        "Access-Control-Allow-Origin": "*"
    },
    "isBase64Encoded": false,
    "body": "{ \"result\": \"Success\" }"
};

// 统一使用async/await处理异步流程
exports.handler = async function (event, context) {
    console.log('Received event:', event);
    try {
        await sendEmail(event);
        return response;
    } catch (err) {
        // 捕获错误并返回失败响应
        console.error('Email send failed:', err);
        return {
            ...response,
            statusCode: 500,
            body: "{ \"result\": \"Failed\" }"
        };
    }
};

// 改写sendEmail为返回Promise的函数
async function sendEmail(event) {
    var params = {
        Destination: {
            ToAddresses: [RECEIVER]
        },
        Message: {
            Body: {
                Text: {
                    Data: `name: ${event.name}\nphone: ${event.phone}\nemail: ${event.email}\ndesc: ${event.desc}`,
                    Charset: 'UTF-8'
                }
            },
            Subject: {
                Data: `Website Referral Form: ${event.name}`,
                Charset: 'UTF-8'
            }
        },
        Source: SENDER
    };
    // 等待SES发送请求完成
    return ses.sendEmail(params).promise();
}

关键修改说明

  • 修复了response的body字段语法错误,确保返回的JSON格式合法。
  • 将sendEmail改为async函数,返回SES请求的Promise,在handler中用await等待邮件发送完成后再返回响应,保证Lambda不会提前终止。
  • 添加了错误捕获逻辑,当邮件发送失败时返回500状态码,并在CloudWatch中记录错误信息,方便后续排查。
  • 使用模板字符串替代字符串拼接,让代码更易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:30:48