从 Alexa 技能调用 AES SES sendEmail

问题描述

我已经尝试了数周来弄清楚如何从 Alexa 托管的 node.js 技能调用 sendEmail 调用用户进行选择是一项非常简单的技能。做出选择后,我想向自己发送一封包含选择内容的电子邮件。我一直在尝试从我的 index.js 调用 sendEmail,其中包含我的技能逻辑。我使用 AWS 上指示的正确 .json 文件创建了一个 IAM 角色,并且能够从向我发送电子邮件的 aws 命令行界面运行基本节点文件。我需要采取什么样的步骤才能让我的 Alexa 技能发送电子邮件?我可以直接调用已经在我的 Alexa 技能中工作的 lambda 函数吗?

我一直在尝试将代码放在下面,并且与它类似的代码没有 nodemailer 执行基本的 ses 发送电子邮件。我从 aws ses 网页开始。我找不到一个教程可以实际引导您逐步完成在 Alexa 技能中调用此 ses 发送电子邮件功能的过程,我将非常感激能指出正确的方向。 '''

const Alexa = require('ask-sdk-core');

const AWS = require("aws-sdk");

let nodemailer = require("nodemailer");
let aws = require("@aws-sdk/client-ses");

// configure AWS SDK
process.env.AWS_ACCESS_KEY_ID = "xxxx";
process.env.AWS_SECRET_ACCESS_KEY = "xxxx";
const ses = new aws.SES({
  apiVersion: "2010-12-01",region: "us-east-1",});

// create Nodemailer SES transporter
let transporter = nodemailer.createTransport({
  SES: { ses,aws },});

// send some mail
transporter.sendMail(
  {
    from: "xxxx@gmail.com",to: "xxxx@gmail.com",subject: "Message",text: "I hope this message gets sent!",ses: {
      // optional extra arguments for SendRawEmail
      Tags: [
        {
          Name: "tag_name",Value: "tag_value",},],(err,info) => {
    console.log(info.envelope);
    console.log(info.messageId);
  }
);

'''

编辑:感谢你们的回复!我得到的唯一值得注意的错误是请求的技能响应存在问题。所以我的 Alexa 技能是亚马逊托管的。我是否必须更改它才能使用 SES,sendEmail()?在我在亚马逊上的 lambda 页面中,我在一个名为 sendEmail() 的文件夹中有一个文件,但这给了我一个关于 AWS = require(etc .. 33:00.315Z e19e74c6-4c00-47dc-9872-77c0a602541a 任务在 3.00 秒后超时”我在 lambda 函数中名为 sendEmail 的代码实际上是下面的代码。sendEmail() 行也给出了请求的问题来自 Alexa 的技能响应。我在 lambda 函数中没有看到我的 Alexa 技能。我必须添加它吗?抱歉,我真的是 AWS 编程的菜鸟。谢谢!

`AWS = require('aws-sdk');
// Set the region 
AWS.config.update({region: 'us-east-1'});
// Create sendEmail params 
var params = {
  Destination: { /* required */
    ToAddresses: [
      'x@gmail.com',/* more items */
    ]
  },Message: { /* required */
    Body: { /* required */
      Html: {
       Charset: "UTF-8",Data: "HTML_FORMAT_BODY"
      },Text: {
       Charset: "UTF-8",Data: "TEXT_FORMAT_BODY"
      }
     },Subject: {
      Charset: 'UTF-8',Data: 'Test email'
     }
    },Source: 'x@gmail.com',/* required */
  ReplyToAddresses: [
     'pamphl3t@gmail.com',/* more items */
  ],};
// Create the promise and SES service object
var sendPromise = new AWS.SES({apiVersion: '2010-12-01'}).sendEmail(params).promise();
// Handle promise's fulfilled/rejected states
sendPromise.then(
  function(data) {
    console.log(data.MessageId);
  }).catch(
    function(err) {
    console.error(err,err.stack);
  });`

解决方法

我相信 this part 的文档正是您要找的。在将自定义技能应用于 Lambda 函数后,您需要将正文内容发送到您的电子邮件:

const querystring = require('querystring');
let post_data = null;
exports.handler = function (event,context) {
post_data = querystring.stringify(event.body);
}

// your emailing code here

也检查这个repo

,

您在哪里定义 process.env?如果您在 Alexa Hosted 中运行,您将获得 Alexa 拥有的 IAM 角色的环境变量,该角色将无法访问 SES。

您是否尝试过对您的个人 AWS 账户中的密钥和秘密进行硬编码?如果解决了问题,请查看在 package.json 中添加 dotenv 包,并按照其文档在 .env 文件中设置值,您可以将其添加到 .gitignore 中。

,
const AWS = require( 'aws-sdk' );

var SES = new AWS.SES( { apiVersion: '2010-12-01',region: 'us-east-1' } );

//when we are sending our email
//we have to return a promise
//this is because the sendEmail funx
//from SES
//is an ASYNCHRONOUS CALL to the simple email server
//we have to wait for this call to complete before RET


//this is the vital line that resolves my issue
if  (typeof Promise === 'undefined' ) {
    
  AWS.config.setPromisesDependency( require( 'bluebird' ) );
  
}


sendEmail("SOME TEXT");

function sendEmail ( text,event,context,callback ){
var link = "";



var params = {
    Destination: {
        ToAddresses: [ "address@gmail.com" ]
    },Message: {
        Body: {
            Text: { Data: link
            }
        },Subject: { Data: " text + " has arrived!" }
    },Source: "verifiedaddress@gmail.com"
};

return SES.sendEmail( params ).promise();
}

         

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...