从 Alexa 技能调用 AES SES sendEmail

Call AES SES sendEmail from a Alexa skill

几周来我一直在尝试弄清楚如何从 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.. 行的错误,在调试器中输出“errorMessage”:“2021-03-14T00: 33:00.315Z e19e74c6-4c00-47dc-9872-77c0a602541a 任务在 3.00 秒后超时”我在名为 sendEmail 的 lambda 函数中的代码实际上是下面的代码。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();
}