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