You need to enable JavaScript to run this app. 如何在亚马逊托管Node.js Alexa技能中调用AWS SES sendEmail发信
优惠活动
大模型
产品
解决方案
定价
更多

如何在亚马逊托管Node.js Alexa技能中调用AWS SES sendEmail发信

托管型Alexa技能对接SES发信实操步骤

当前报错的根源定位

  • 3秒超时、SDK加载报错:之前的代码同时硬编码了AK/SK、混装了v2/v3版本的AWS SDK、还额外引入了nodemailer包,冗余依赖会大幅拖慢Lambda冷启动速度,硬编码密钥还会触发SDK额外的身份校验逻辑,直接把冷启动时间拉到超时阈值以上
  • 找不到托管Alexa技能的关联资源:托管Alexa技能的后端代码逻辑运行在Alexa侧专属的Lambda实例上,不会同步出现在普通AWS账户的Lambda控制台函数列表里,对应的管理入口在Alexa开发者控制台的「主机服务」页面,不需要在普通Lambda控制台查找
  • 不需要手动关联独立调试的发信Lambda:跨Lambda调用会额外增加网络延迟、需要额外配置调用权限,完全没必要,直接把发信逻辑集成到技能核心代码里是最稳妥的方案

零依赖可运行的集成代码

托管Alexa技能的Node.js运行环境已经内置了v2版本的aws-sdk,不需要额外安装@aws-sdk/client-ses、nodemailer这类第三方包,能最大程度缩短冷启动时间:

const Alexa = require('ask-sdk-core');
// 全局初始化SES客户端,复用TCP连接,避免每次请求重复初始化拉慢速度
const SES = require('aws-sdk/clients/ses');
const sesClient = new SES({
  region: 'us-east-1', // 必须和你SES验证发件邮箱/域名的区域完全一致
  apiVersion: '2010-12-01'
});

// 封装通用发信方法
async function sendUserSelectionMail(selectedContent) {
  const sendParams = {
    Destination: {
      ToAddresses: ["你的固定接收邮箱@example.com"]
    },
    Message: {
      Body: {
        Text: {
          Charset: "UTF-8",
          Data: `用户完成选项选择,选中内容:${selectedContent}`
        }
      },
      Subject: {
        Charset: 'UTF-8',
        Data: 'Alexa技能用户选择通知'
      }
    },
    Source: "你已在SES完成验证的发件邮箱@example.com" // 必须是SES侧已验证的地址,否则会被接口拒绝
  };
  // 同步等待发信流程完成,不要用无等待的回调形式
  return await sesClient.sendEmail(sendParams).promise();
}

// 用户完成选择的Intent处理器示例
const SelectionCompleteHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name === 'CompleteSelectionIntent';
  },
  async handle(handlerInput) {
    // 从槽位里拿到用户选中的内容
    const selectedSlotValue = handlerInput.requestEnvelope.request.intent.slots.selectedOption.value;
    try {
      // 等发信完全走完再返回语音响应,避免异步流程提前结束导致请求异常
      await sendUserSelectionMail(selectedSlotValue);
      return handlerInput.responseBuilder
        .speak("已经把你选的内容发送到指定邮箱了")
        .getResponse();
    } catch (err) {
      console.error('SES发信失败:', err);
      return handlerInput.responseBuilder
        .speak("发信环节出现小问题,你可以稍后再尝试哦")
        .getResponse();
    }
  }
};

// 原有技能的基础处理器(启动、帮助、取消等逻辑)保持不变,按原有方式注册即可
exports.handler = Alexa.SkillBuilders.custom()
  .addRequestHandlers(
    // 在这里把原有所有处理器和上面的SelectionCompleteHandler加进去
  )
  .lambda();

权限配置操作步骤

  • 进入Alexa开发者控制台的对应技能页面,找到「权限」设置栏,直接勾选Amazon SES sendEmail权限,系统会自动给托管的后端Lambda附加对应的权限策略,不需要手动配置IAM角色、也不需要手动关联任何独立资源
  • 如果之前的SES处于沙箱测试状态,记得把收件邮箱也加到SES的已验证地址列表里,否则会被接口拒绝发信

常见问题排查

  • 代码里不要硬编码AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY:托管环境会自动注入对应权限的临时访问凭证,硬编码密钥既不安全,还会拖慢SDK加载速度
  • 超时阈值调整:在托管技能的主机服务设置里,把Lambda超时时间从默认的3秒调到5秒,配合上面的零依赖代码,冷启动时间一般在1秒以内,完全不会触发超时
  • 区域一致性检查:如果报权限错误,首先确认SES客户端配置的区域,和控制台里SES验证地址的区域完全匹配,跨区域调用会被SES直接拒绝

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 02:06:02