基于AWS SES的Node.js应用本地正常发信,Lambda部署后无法发送
解决AWS Lambda部署后无法通过SES发送邮件的问题
1. 修复sendMail函数的Promise返回问题
当前sendMail函数为async类型,但内部未返回邮件发送的Promise,导致await sendMail调用时无法等待发送流程完成,Lambda会提前终止执行。修改代码如下:
const sendMail = async (params) => { const { toAddress, baseUrl, dealId, applicantName, dealType, appLogo } = params; const url = `${baseUrl}/personalInfo/${dealId}`; const jsonParameters = { "user": applicantName, "image": appLogo, "dealType": dealType, "link": url }; const jsonPayload = JSON.stringify(jsonParameters); var emailParams = { Destination: { ToAddresses: [toAddress] }, Source: "info_some_random_app@gmail.com", Template: 'MyTemplate', TemplateData: jsonPayload }; try { // 直接返回Promise,让await等待执行结果 return new aws.SES({apiVersion: '2010-12-01'}).sendTemplatedEmail(emailParams).promise(); } catch (error) { throw error; // 修正之前错误抛出express实例的问题 } };
2. 对齐Lambda与本地Node.js版本
CloudWatch日志显示Lambda使用Node.js 14运行时,但本地开发版本为v18.12.1,版本差异可能导致依赖或SDK行为不一致。在Serverless配置文件(serverless.yml)中指定运行时:
provider: name: aws runtime: nodejs18.x region: ap-northeast-1
3. 给Lambda执行角色添加SES权限
Lambda的IAM执行角色需要具备ses:SendTemplatedEmail权限才能调用SES API,在Serverless配置中添加权限声明:
provider: # 其他已有配置... iamRoleStatements: - Effect: Allow Action: - ses:SendTemplatedEmail Resource: "*" # 建议限定到目标SES模板ARN以提升安全性
4. 修复接口错误处理的变量问题
/sendmail接口的catch块中存在变量名错误,修改后确保返回正确的错误信息:
app.post('/sendmail',async(req,res)=>{ try{ let mailResponse = await sendMail(req.body); res.status(200).json({mailStatus: mailResponse}) } catch(err){ res.status(500).json({error: err.message}); // 修正变量名并返回标准错误响应 } })
5. 验证SES模板有效性
确认SES控制台中MyTemplate模板已创建且状态正常,模板内的变量与代码中jsonParameters的字段完全匹配,避免因模板不存在或变量不匹配导致发送失败。
内容的提问来源于stack exchange,提问作者Raymond Thomas
相关产品推荐
相关产品推荐

