AWS Lambda部署后SNS触发运行报ValidationException错误求助
报错原因
这个报错是AWS SES接口抛出的参数校验错误,触发原因是调用邮件发送接口时传入的收件人列表为空,对应代码里有三个核心问题:
- SNS事件的
Message字段默认是JSON序列化字符串,你没有做解析直接当作对象访问属性,导致clientEmail取值为undefined mailOptions配置中的to字段错误加了单引号,把变量变成了固定字符串clientEmail,同时缺少闭合单引号存在语法问题- 没有对入参、邮箱地址做非空校验,空的收件人地址传给SES后直接触发参数校验失败
修复方案
替换为如下修改后的代码即可:
const pug = require('pug'); const {newTransporter} = require('./handlers/emailTransporter'); exports.handler = async (event, context) => { // 解析SNS消息字符串为对象 const message = JSON.parse(event.Records[0].Sns.Message); // 校验SNS消息结构合法性 if (!message?.mail?.commonHeaders) { console.error('SNS消息结构异常:', JSON.stringify(message)); return; } const mailAddressObj = { // replyTo为数组格式,取第一个元素 'userEmail' : message.mail.commonHeaders.replyTo?.[0], 'clientEmail' : message.mail.commonHeaders.to?.[0], } const {userEmail, clientEmail} = mailAddressObj; // 校验收件人地址非空 if (!clientEmail) { console.error('收件人地址为空:', JSON.stringify(mailAddressObj)); return; } const html = pug.compileFile('./views/bounceNotificationEmail.pug'); const mailOptions = { from: 'sendingEmail@email.com', // 直接使用变量,不要加单引号 to: clientEmail, subject: `Subject Header`, html: html({ client_email: clientEmail }), }; try { let transporter = await newTransporter(); let info = await transporter.sendMail(mailOptions); console.log("邮件发送成功,messageId: %s", info.messageId); return info; } catch (e) { console.error('发送邮件失败: ', e); // 按需打开注释配置重试 // throw e; } };
额外注意事项
- 如果你的AWS SES还处于沙箱环境,需要先在SES控制台验证发件人和收件人邮箱地址才能正常发送
- 确认Lambda执行角色已配置
ses:SendEmail、ses:SendRawEmail权限
内容的提问来源于stack exchange,提问作者marcusalint
相关产品推荐
相关产品推荐

