使用Twilio发送数千条短信

时间:2017-10-12 20:53:02

标签: javascript node.js sms twilio

我想用Twilio发送~5000短信,我只是想知道如果我循环通过这个大小的电话号码阵列,我的请求是否会崩溃。事实上,Twilio每个请求只允许1条消息,因此我必须生成50,000条消息。

是否可以这样做或者我必须找到另一种方式? 50,000似乎太多了,但我不知道我能做多少请求。

phoneNumbers.forEach(function(phNb)
{
    client.messages.create({
        body: msgCt,
        to: phNb,
        from: ourPhone
    })
    .then((msg) => {
        console.log(msg.sid);
    });
})

提前致谢

3 个答案:

答案 0 :(得分:2)

Twilio开发者传道者在这里。

API限制

首先,快速说明我们的限制。使用单个数字,Twilio每秒发送一条消息的限制。您可以通过添加更多数字来增加它,因此10个数字将能够每秒发送10条消息。 A short code can send 100 messages per second.

We also recommend that you don't send more than 200 messages on any one long code per day.

无论哪种方式,我建议使用messaging service发送此类邮件。

最后,您还限制为100个并发API请求。很高兴看到这里的其他答案是关于顺序而不是异步地提出请求,因为这会占用服务器上的内存以及开始查找请求被Twilio拒绝。

Passthrough API

我们现在有一个API,允许您通过单个API调用发送多条消息。它被称为passthrough API,因为它允许您将许多数字传递到Notify service。您需要将您的号码转换为“绑定”并通过Notify服务发送它们,Notify服务也使用消息服务进行数字池化。

The code looks a bit like this:

const Twilio = require('twilio');    
const client = new Twilio(accountSid, authToken);
const service = client.notify.services('ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');

service.notifications
  .create({
    toBinding: [
      JSON.stringify({
        binding_type: 'sms',
        address: '+15555555555',
      }),
      JSON.stringify({
        binding_type: 'facebook-messenger',
        address: '123456789123',
      }),
    ],
    body: 'Hello Bob',
  })
  .then(notification => {
    console.log(notification);
  })
  .catch(error => {
    console.log(error);
  })

您的情况唯一的缺点是每条消息都需要相同,并且请求的大小必须小于1兆字节。我们发现这通常意味着大约10,000个数字,因此您可能需要将列表分解为5个API调用。

让我知道这是否有帮助。

答案 1 :(得分:1)

由于每次正文调用都没有阻止,您发送请求是异步的,我想这对客户来说速度最快。但问题是:Twilio是否允许来自单一来源的此类负载?它需要进行测试......如果不是,你应该构建某种请求队列,例如:承诺,如

function sendSync(index = 0) {
  if(index === phoneNumbers.length) {
    return;
  }
  client.messages.create({
      body: msgCt,
      to: phoneNumbers[index],
      from: ourPhone
  })
  .then(function(msg) {
      console.log(msg.sid);
      sendSync(index + 1);
  })
  .catch(function(err) {
      console.log(err);
  });
}

sendSync();

或者如果你喜欢async / await -

async function sendSync() {
  for (let phNb of phoneNumbers) {
    try {
      let msg = await client.messages.create({
        body: msgCt,
        to: phNb,
        from: ourPhone
      });
      console.log(msg);
    } catch(err) {
      console.log(err);
    } 
  })
}

sendSync();

答案 2 :(得分:0)

这里有两个因素。

  • 您需要考虑Twilio Api usage Limits.
  • 执行50.000个并行的http请求(实际上你的代码是这样做的)并不是一个好主意:你会遇到内存问题。

Twilio sms根据来源和目的地限制更改。

你有两个解决方案:

按顺序执行50k http请求

    phoneNumbers.forEach(async function(phNb){
      try {
        let m = await client.messages.create({
          body: msgCt,
          to: phNb,
          from: ourPhone
        })
        console.log(a)
      } catch(e) {
        console.log(e)
      } 
    })

与并发级别同时执行50k http请求

这对于令人敬畏的蓝鸟糖功能来说非常容易。无论如何,twilio包使用原生承诺。为此,您可以使用带mapLimit方法的异步模块