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

Next.js调用Amazon SES发信出现API未返回响应报错如何解决

问题根因

你遇到的报错本质是两个异步逻辑处理问题共同导致的:

  • Next.js API 路由要求所有请求必须明确返回响应,你现有代码的handler函数全程没有调用res对象的返回方法,逻辑执行完成后没有给客户端返回任何结果,就会触发API resolved without sending a response的提示。
  • sendMail函数内部是异步调用AWS SES接口,但是没有将异步Promise返回,外层路由无法感知到发信操作还在执行,同步代码跑完就直接结束了请求上下文,甚至可能出现发信逻辑还没执行完就被中断的情况。
修复方案

1. 修改sendmail.js

调整函数逻辑,直接返回SES发信的Promise,不用单独定义result变量承接结果:

var AWS = require('aws-sdk');

AWS.config.update({ region: process.env.AWS_REGION });

function sendMail(Email) {
    var params = {
        Destination: {
            CcAddresses: [Email],
            ToAddresses: [Email]
        },
        Message: {
            Body: {
                Html: {
                    Charset: "UTF-8",
                    Data: "HTML_FORMAT_BODY"
                },
                Text: {
                    Charset: "UTF-8",
                    Data: "TEXT_FORMAT_BODY"
                }
            },
            Subject: {
                Charset: 'UTF-8',
                Data: 'Test email'
            }
        },
        Source: 'abc@gmail.com',
        ReplyToAddresses: ['abc12@gmail.com'],
    };
    // 直接返回Promise,外层可以等待执行结果
    return new AWS.SES({ apiVersion: '2010-12-01' }).sendEmail(params).promise();
}

export default sendMail;

2. 修改dynamicid.js

将路由处理函数改为async异步函数,等待所有异步操作完成后明确返回响应,报错场景也要返回错误提示:

import { getDataFromSheets } from '../../../libs/sheets';
import sendmail from '../../../libs/ses/sendmail';

export default async function handler(req, res) {
  try {
    const sheet = await getDataFromSheets();
    // 批量发信用Promise.all等待所有发信请求完成
    const sendTasks = sheet.slice(1).map(item => sendmail(item.Email));
    await Promise.all(sendTasks);
    // 明确返回成功响应
    return res.status(200).json({ status: 'success', message: '所有邮件已发送完成' });
  } catch (err) {
    console.error(err);
    // 错误场景也要返回响应
    return res.status(500).json({ status: 'fail', message: '操作失败', error: err.message });
  }
}
额外注意事项
  • 如果你还在AWS SES沙箱环境中,发件地址abc@gmail.com和所有收件地址都需要提前在SES控制台完成验证,否则会触发发信失败。
  • 确保Next.js项目已经正确配置AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_REGION三个环境变量,对应账号拥有SES发信权限。
  • 如果收件人数量较多,建议调用SES批量发信接口或者添加请求限流,避免触发AWS的接口调用频率限制。

内容的提问来源于stack exchange,提问作者Monu Patil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:36:07