1

几周以来,我一直在尝试弄清楚如何从 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);
  });`
4

3 回答 3

1

我相信这部分文档是您正在寻找的。将自定义技能放在 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

于 2021-03-14T00:21:41.673 回答
0
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();
}

         
于 2021-07-17T20:02:16.613 回答
0

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

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

于 2021-03-14T19:56:01.333 回答