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

如何实现网站接收数据触发AWS Lambda发邮件并备份到DynamoDB

解决方案

前置配置检查

  • 为你的Lambda执行角色新增DynamoDB写入权限,开放dynamodb:PutItem操作到你的Users表
  • 确认你的DynamoDB Users表的主键为id,如果主键名不同请同步修改后续代码里的Item字段

整合后完整代码

var AWS = require('aws-sdk');
// 统一配置区域
AWS.config.update({ region: "us-east-1" });
var ses = new AWS.SES();
var documentClient = new AWS.DynamoDB.DocumentClient();
 
var RECEIVER = 'contactus@example.com'; // 替换为你的收件邮箱
var SENDER = 'contactus@example.com'; // 替换为你的SES发件邮箱
var ALLOW_ORIGIN = 'example.com'; // 替换为你的网站域名

var response = {
 "isBase64Encoded": false,
 "headers": { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': ALLOW_ORIGIN},
 "statusCode": 200,
 "body": "{\"result\": \"Success.\"}"
 };

exports.handler = async function (event, context) {
    console.log('Received event:', event);
    try {
        // 1. 发送邮件逻辑
        await sendEmail(event);
        // 2. 写入DynamoDB逻辑
        await saveToDynamo(event);
        // 两个操作都成功返回响应
        return response;
    } catch (err) {
        console.error('操作失败:', err);
        return {
            ...response,
            statusCode: 500,
            body: JSON.stringify({result: 'Fail', error: err.message})
        }
    }
};
 
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
    };
    // 回调转promise方便await调用
    return ses.sendEmail(params).promise();
}

function saveToDynamo(event) {
    const params = {
        TableName: "Users", // 如果你的表名不同请修改
        Item:{
            // 生成唯一id避免主键冲突,不需要可以换成你自己的主键生成规则
            id : Date.now() + Math.random().toString(36).substr(2),     
            name: event.name,
            phone: event.phone,
            desc: event.desc,
            email: event.email
        }
    };
    return documentClient.put(params).promise();
}

核心修改说明

  • 统一使用async/await处理异步逻辑,避免原代码回调和async混用导致的时序问题,保证邮件发送和数据存储两个操作都执行完成后再返回响应
  • DynamoDB的写入字段全部从表单提交的event对象中获取,替换原代码中写死的测试值
  • 新增唯一主键生成逻辑,避免重复id导致的DynamoDB写入覆盖问题
  • 增加统一错误捕获,出错时会返回具体错误信息方便排查

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:06:01