Невозможно отправить письмо от функции Lambda, созданной для навыка Alexa, используя пакет узла Mailgun
Я пытаюсь отправить уведомление по электронной почте в Mailgun(авторизованный идентификатор) из навыка alexa. Код работает нормально при запуске изолированно в среде узла. Но не удается отправить почту при выполнении на лямбда.
Вот сегмент кода:
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});
Лямбда-функция установлена правильно как:
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();
};
Нет проблем с выполнением лямбда-кода, весь код выполняется, и ответ от Alexa получен как "Сообщение отправлено". Но на самом деле это не так. В идеале он должен сначала отправить письмо, а затем отправить ответ.
Я использую Apex для лямбда-развертывания, и я правильно установил переменную среды в project.json как "environment":
{
"MAILGUN_API_KEY": "${MAILGUN_API_KEY}",
"MAILGUN_DOMAIN": "${MAILGUN_DOMAIN}"
}
1 ответ
Я не могу сказать, почему письма не отправляются, но я бы предложил изменить структуру кода примерно так:
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
из внешней сферы
Если по-прежнему существует проблема с отправкой сообщения, по крайней мере, теперь оно будет зарегистрировано, и вы сможете продолжить отладку.