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

AWS SES+API Gateway+HTML联系表单部署失败:InvalidParameterValue: Missing final '@domain' 报错排查求助

AWS SES+API Gateway+HTML联系表单部署失败:InvalidParameterValue: Missing final '@domain' 报错排查求助

各位大佬好!我最近在给自己的网站搭一个联系表单,用了AWS SES+API Gateway+Lambda的组合,感觉快成了,但源地址这块总出问题,一直收到InvalidParameterValue: Missing final '@domain'的报错。我用了URL编码来传数据(因为只有文本字段,没必要用multipart),下面是我的全部代码,麻烦帮忙看看哪里错了!

HTML联系表单代码

<form id='contact-form'>
  <label for='replyTo'>Email</label>
  <input name='replyTo' id='replyTo' type='email' autocomplete='email' required>

  <label for='subject'>Subject</label>
  <input name='subject' id='subject' required>

  <label for='message'>Message</label>
  <textarea name='message' id='message' autocapitalize='sentences' maxlength='3000' minlength='10' placeholder='Comment text' rows='3' spellcheck='true' required></textarea>

  <button id='submit-btn' type='button'>Send</button>
</form>

前端JS处理逻辑

const submitBtn = document.getElementById('submit-btn'),
      htmlForm = document.getElementById('contact-form'), //contact form
      endpoint = "https://xxxxxxxxxx.execute-api.us-west-2.amazonaws.com/Email";

submitBtn.addEventListener('click', () => {
  const formData = new FormData(htmlForm),
        urlEncodedData = new URLSearchParams();

  for (const pair of formData.entries()) {
    urlEncodedData.append(pair[0], pair[1]);
  }

  htmlForm.requestSubmit();

  fetch(endpoint, {
    method: "post",
    body: urlEncodedData,
    headers: {
      "Content-Type": "application/x-www-form-urlencoded"
    }
  }).then(response => {
    if (response.ok) {
      resetForm();
    } else {
      throw new Error(`HTTP error. Status: ${response.status}`);
    }
  });
});

htmlForm.addEventListener('submit', (event) => {
  event.preventDefault(); // prevents submitting to self (page)
});

AWS Lambda处理函数

const AWS = require('aws-sdk'),
      ses = new AWS.SES(),
      querystring = require('querystring');

exports.handler = async (event) => {
  const formData = querystring.parse(event.body),
        message = formData.message,
        replyTo = formData.replyTo,
        subject = formData.subject,
        emailParams = {
          Source: "form@<verified_domain_tld_here>",
          Destination: {
            ToAddresses: ["<my actual email address>"]
          },
          Message: {
            Subject: {
              Data: `${subject}`
            },
            Body: {
              Text: {
                Data: `${message}`
              }
            }
          },
          ReplyToAddresses: [`${replyTo}`]
        };

  try {
    await ses.sendEmail(emailParams).promise();
    console.log(successMessage);
    return {
      statusCode: 200,
      body: JSON.stringify({ message: successMessage })
    };
  } catch (err) {
    console.log(err);
    return {
      statusCode: err.statusCode || 500,
      body: JSON.stringify({ message: err.message || errorMessage })
    };
  }
};

补充说明:我已经确认SES里的<verified_domain_tld_here>是已经验证过的域名,前端表单里的邮箱字段也加了type='email'的校验,按道理传过来的replyTo应该是合法邮箱,但就是源地址相关的报错一直出现,实在搞不懂哪里出问题了,求各位大佬指点!

备注:内容来源于stack exchange,提问作者leecalvink

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 14:54:36