Невозможно отправить письмо от функции 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 из внешней сферы

Если по-прежнему существует проблема с отправкой сообщения, по крайней мере, теперь оно будет зарегистрировано, и вы сможете продолжить отладку.

Другие вопросы по тегам