1

我有 Twilio Studio 调用 Twilio 函数并需要它将电子邮件发送到电子邮件的变量列表(小列表)。这个问题主要是围绕它们循环,因为我可以很好地传递变量。我有一系列电子邮件要向其发送文本,并且在 Twilio 函数中。但我在网上找到的所有例子都是关于只发送给 ONE 的。我的一部分认为这需要是一个 Twilio 函数调用另一个 Twilio 函数(一个循环,另一个发送电子邮件)......但我无法找到一种方法来做到这一点。如果我可以将它包含在一个 Twilio 函数中,那就太好了。

我有 Twilio Studio 调用 Twilio 函数。我需要将这一切都保留在 Twilio 上......所以通过 PHP 循环并一次运行一个函数是行不通的。我需要它在 Twilio 的无服务器设置上运行。

这是我所拥有的一个例子:

exports.handler = function(context, event, callback) {
    // using SendGrid's v3 Node.js Library
    // https://github.com/sendgrid/sendgrid-nodejs
    const sgMail = require('@sendgrid/mail');
    sgMail.setApiKey(context.SENDGRID_API_KEY);
    const msg = {
      to: 'me@example.com',
      from: 'noreply@example.com',
      templateId: 'my-id-goes-here',
      dynamic_template_data: {
        recipient_name: 'John Smith'
      }
    };
    sgMail.send(msg).then(response => {
      let twiml = new Twilio.twiml.MessagingResponse();
      callback(null, twiml);
    })
    .catch(err => {
      callback(err);
    });
};

这是我试图以类似的方式循环并失败

exports.handler = function(context, event, callback) {
    const sgMail = require('@sendgrid/mail');

    sgMail.setApiKey(context.SENDGRID_API_KEY);

    var responder_emails = 'me@example.com,me+test1@example.com';
    var emails_a = responder_emails.split(',');

    emails_a.forEach(function(responder_email) {
        const msg = {
          to: responder_email,
          from: 'noreply@example.com',
          templateId: 'my-id-goes-here',
          dynamic_template_data: {
            recipient_name: 'John Smith'
          }
        };
        sgMail.send(msg);
    });

    callback();
};

我可以将多封电子邮件传递到 Twilio 函数中……我只是不确定如何正确循环。

4

1 回答 1

2

嘿嘿。Twilio 布道者在这里。

在您的第一个示例中,您理所当然地等待send使用then. 在您的第二个示例中,您错过了这一点。你打了几个send电话,但callback没有等待就立即打电话。

一个固定的(大致原型版本)可能如下所示。

exports.handler = function(context, event, callback) {
  const sgMail = require('@sendgrid/mail');

  sgMail.setApiKey(context.SENDGRID_API_KEY);

  var responder_emails = 'me@example.com,me+test1@example.com';
  var emails_a = responder_emails.split(',');

  Promise.all(emails_a.map(function(responder_email) {
    const msg = {
      to: responder_email,
      from: 'noreply@example.com',
      templateId: 'my-id-goes-here',
      dynamic_template_data: {
        recipient_name: 'John Smith'
      }
    };
    return sgMail.send(msg);
  })).then(function() {
    callback();
  }).catch(function(e) {
    callback(e);
  })
});

您已经有一系列电子邮件,因为您调用了split. 您可以将此数组与Array.map和结合使用Promise.all

Map 基本上会遍历您的数组,并允许您使用从 map 内部的函数返回的任何内容创建一个新数组。上面的代码所做的是它转换[email, email][Promise, Promise]. 承诺是 的返回值sgMail.send

现在,您有一个数组,其中包含将在 sendgrid 接受您的呼叫时解析的承诺,您可以使用Promise.all. 此方法等待所有的 Promise 被解决(或拒绝)并返回一个新的 Promise,你可以使用then它。完成所有 sendgrid 调用后,就可以通过调用 function 来完成该函数了callback

旁注:这个“map/Promise.all”技巧并行执行所有发送网格调用。在某些情况下,您可能希望一个接一个地调用它们(假设您正在进行大量调用并遇到速率限制)。

希望有帮助,让我知道它是怎么回事。:)

于 2019-03-25T21:24:04.967 回答