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

AWS Lambda+SES与前端JS对接邮件发送故障排查求助

问题定位与修复方案

核心问题分析

从你提供的代码来看,主要存在两个关键语法/逻辑错误,导致邮件无法发送:

1. Lambda中不必要的JSON二次解析错误

前端发送的请求体里,body字段是一个JavaScript对象(通过JSON.stringify序列化后传递),但你的Lambda代码中尝试对这个对象再次执行JSON.parse(requestBody.body),这会直接抛出语法错误——因为JSON.parse只能解析字符串,不能解析对象。

2. Lambda中邮件内容的模板字符串语法缺失

你构建邮件文本和HTML内容时,没有使用模板字符串的反引号(`),导致JavaScript语法错误,无法正确生成邮件内容。

具体修复步骤

修复Lambda代码

以下是修正后的Lambda代码,解决上述两个核心问题:

import { SESClient, SendEmailCommand } from "@aws-sdk/client-ses";
const ses = new SESClient({ region: "us-west-1" });

export const handler = async (event) => {
    // 仅解析一次请求体即可
    const requestBody = JSON.parse(event.body);
    // 直接使用requestBody.body,无需二次解析
    const userData = requestBody.body;

    try {
        const command = new SendEmailCommand({
            Destination: {
                ToAddresses: [requestBody.recipient],
            },
            Message: {
                Body: {
                    Text: {
                        // 使用反引号包裹模板字符串
                        Data: `Name: ${userData.name}\nEmail: ${userData.email}\nMessage: ${userData.message}`
                    },
                    Html: {
                        // 使用反引号包裹模板字符串,直接写HTML标签无需转义
                        Data: `<html><body><h1>New message from ${userData.name}</h1><p>Email: ${userData.email}</p><p>Message: ${userData.message}</p></body></html>`
                    }
                },
                Subject: { 
                    Data: requestBody.subject
                }
            },
            Source: requestBody.source
        });

        const response = await ses.send(command);
        console.log("Email sent!", response);
        return {
            isBase64Encoded: false,
            statusCode: 200,
            headers: {
                "Content-Type": "application/json",
                "Access-Control-Allow-Origin": "*" 
            },
            body: JSON.stringify({
                message: "Email sent successfully!",
                responseId: response.MessageId
            })
        };
    } catch (error) {
        console.error("Failed to send email.", error);
        return {
            isBase64Encoded: false,
            statusCode: 500,
            headers: {
                "Content-Type": "application/json",
                "Access-Control-Allow-Origin": "*"
            },
            body: JSON.stringify({
                message: "Failed to send email",
                errorMessage: error.message,
                stack: error.stack // 增加堆栈信息方便排查
            })
        };
    }
};

前端代码优化(可选)

前端代码本身逻辑正确,但可以增加对错误信息的捕获,方便排查:

document.getElementById('contactForm').addEventListener('submit', async function(e) {
    e.preventDefault();

    const formData = new FormData(this);
    const data = {
        name: formData.get('name'),
        email: formData.get('email'),
        message: formData.get('message')
    };

    const apiUrl = 'KEY###'; // 替换为你的API Gateway URL

    try {
        const response = await fetch(apiUrl, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                subject: "Message from My Website",
                body: data,
                source: "EMAIL###", // 替换为你的SES验证邮箱
                recipient: "EMAIL###" // 替换为收件邮箱
            })
        });

        const result = await response.json();

        if (response.ok) {
            alert('Email sent successfully!');
            document.getElementById('contactForm').reset();
        } else {
            // 显示具体错误信息
            alert(`Failed to send email: ${result.errorMessage}`);
            console.error('Error details:', result);
        }
    } catch (error) {
        console.error('Network error:', error);
        alert('There was an error sending your message. Please check the console for details.');
    }
});

额外排查建议

  1. 查看Lambda日志:进入AWS Lambda控制台,找到你的函数,查看监控下的CloudWatch Logs,确认是否有语法错误或数据解析错误的日志信息。
  2. 验证API Gateway集成:确保API Gateway的POST方法确实使用了Lambda代理集成,这样event.body才会正确传递前端发送的JSON字符串。
  3. SES邮箱验证:确认source和recipient邮箱都已在SES中完成验证(沙箱模式下必须验证所有收发邮箱)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 10:45:02