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.'); } });
额外排查建议
- 查看Lambda日志:进入AWS Lambda控制台,找到你的函数,查看监控下的CloudWatch Logs,确认是否有语法错误或数据解析错误的日志信息。
- 验证API Gateway集成:确保API Gateway的POST方法确实使用了Lambda代理集成,这样
event.body才会正确传递前端发送的JSON字符串。 - SES邮箱验证:确认
source和recipient邮箱都已在SES中完成验证(沙箱模式下必须验证所有收发邮箱)。
内容的提问来源于stack exchange,提问作者Archer Technologies
相关产品推荐
相关产品推荐

