无法使用 Mailgun 节点包从为 Alexa 技能创建的 Lambda 函数发送电子邮件
Unable to send Email from Lambda function created for Alexa skill using Mailgun node package
我正在尝试从 alexa 技能向 Mailgun(授权 ID)发送电子邮件通知。在节点环境中隔离启动时,代码工作正常。但在 Lambda 上执行时无法发送邮件。
这里是代码段:
var User= this.attributes['UserName']; /*session variable is working fine...*/
var data = {
from: 'xxxxxxxx', /*Mailgun sandbox*/
to: 'zzzzzzzz', /* Authorized mail ID*/
subject: 'Request',
text: `Hi, ${Alias} is waiting for you.`
};
mailgun.messages().send(data, function(error, body) {
console.log(body);
});
this.response.speak('A message has been sent to ${User}.');
this.emit(':responseReady');
编辑: 我的环境变量正确设置为:
/* Parameters for MAILGUN*/
var api_key = process.env.MAILGUN_API_KEY;
var domain = process.env.MAILGUN_DOMAIN;
var mailgun = require('mailgun-js')({apiKey: api_key, domain: domain});
Lambda 函数正确设置为:
exports.handle = function(event, context) { /* "index.handler" would call
exports.handler in index.js.*/
var alexa = Alexa.handler(event, context);
alexa.appId = appId;
alexa.registerHandlers(newSessionHandler, greetingHandler, aliasHandler, addressHandler, daysHandler1, accessHandler, daysHandler2, hostnameHandler, hostHandler, facilityHandler1, facilityHandler2, hsschrHandler, hsschostHandler); /* List of handlers */
alexa.execute();
};
lambda 代码执行没有问题,整个代码得到执行并从 Alexa 收到响应,如 "A message has been sent"。但实际上并非如此。理想情况下,它应该先发送邮件,然后发出响应。
我正在使用 Apex 进行 lambda 部署,并且我已在 project.json 中将环境变量正确设置为 "environment":
{
"MAILGUN_API_KEY": "${MAILGUN_API_KEY}",
"MAILGUN_DOMAIN": "${MAILGUN_DOMAIN}"
}
我不能说为什么没有发送电子邮件,但我的建议是 re-structure 代码有点像这样:
mailgun.messages().send(data, (error, body) => {
if (error) {
console.log('something went wrong');
console.log(error);
} else {
console.log('message sent')
console.log(body);
this.response.speak('A message has been sent to ${User}.');
this.emit(':responseReady');
}
});
有几点需要注意:
this.response.speak
和 this.emit
现在发生在回调函数中,因此 Alexa 只会在消息发送成功后说话,这看起来是您想要的行为
- 我将回调函数从标准
function(error, body) {}
更改为箭头函数 (error, body) => {}
。这基本上允许您在回调中使用 this
并且它从外部范围 引用 this
如果发送消息仍然存在问题,至少现在它会被记录下来,您可以进一步调试。
我正在尝试从 alexa 技能向 Mailgun(授权 ID)发送电子邮件通知。在节点环境中隔离启动时,代码工作正常。但在 Lambda 上执行时无法发送邮件。
这里是代码段:
var User= this.attributes['UserName']; /*session variable is working fine...*/
var data = {
from: 'xxxxxxxx', /*Mailgun sandbox*/
to: 'zzzzzzzz', /* Authorized mail ID*/
subject: 'Request',
text: `Hi, ${Alias} is waiting for you.`
};
mailgun.messages().send(data, function(error, body) {
console.log(body);
});
this.response.speak('A message has been sent to ${User}.');
this.emit(':responseReady');
编辑: 我的环境变量正确设置为:
/* Parameters for MAILGUN*/
var api_key = process.env.MAILGUN_API_KEY;
var domain = process.env.MAILGUN_DOMAIN;
var mailgun = require('mailgun-js')({apiKey: api_key, domain: domain});
Lambda 函数正确设置为:
exports.handle = function(event, context) { /* "index.handler" would call
exports.handler in index.js.*/
var alexa = Alexa.handler(event, context);
alexa.appId = appId;
alexa.registerHandlers(newSessionHandler, greetingHandler, aliasHandler, addressHandler, daysHandler1, accessHandler, daysHandler2, hostnameHandler, hostHandler, facilityHandler1, facilityHandler2, hsschrHandler, hsschostHandler); /* List of handlers */
alexa.execute();
};
lambda 代码执行没有问题,整个代码得到执行并从 Alexa 收到响应,如 "A message has been sent"。但实际上并非如此。理想情况下,它应该先发送邮件,然后发出响应。
我正在使用 Apex 进行 lambda 部署,并且我已在 project.json 中将环境变量正确设置为 "environment":
{
"MAILGUN_API_KEY": "${MAILGUN_API_KEY}",
"MAILGUN_DOMAIN": "${MAILGUN_DOMAIN}"
}
我不能说为什么没有发送电子邮件,但我的建议是 re-structure 代码有点像这样:
mailgun.messages().send(data, (error, body) => {
if (error) {
console.log('something went wrong');
console.log(error);
} else {
console.log('message sent')
console.log(body);
this.response.speak('A message has been sent to ${User}.');
this.emit(':responseReady');
}
});
有几点需要注意:
this.response.speak
和this.emit
现在发生在回调函数中,因此 Alexa 只会在消息发送成功后说话,这看起来是您想要的行为- 我将回调函数从标准
function(error, body) {}
更改为箭头函数(error, body) => {}
。这基本上允许您在回调中使用this
并且它从外部范围 引用
this
如果发送消息仍然存在问题,至少现在它会被记录下来,您可以进一步调试。