如何使用nodemailer SES传输正确地限制消息发送?

时间:2018-01-19 10:07:46

标签: node.js amazon-web-services nodemailer amazon-ses

The nodemailer documentation说:

  

如果您使用费率或连接限制,那么您也可以使用帮助程序   检测发送队列是否已满的方法。这会有所帮助   避免缓冲过多的消息。

它还提供了一个例子:

let transporter = nodemailer.createTransport({
    SES: new aws.SES({
        apiVersion: '2010-12-01'
    }),
    sendingRate: 1 // max 1 messages/second
});

// Push next messages to Nodemailer
transporter.on('idle', () => {
    while (transporter.isIdle()) {
        transporter.sendMail(...);
    }
});

不幸的是,这对我来说相当神秘。 sendingRate: 1仅提供帮助,还是处理限制?

此外,这段代码看起来像是sendMail(...)执行后它会无限循环。我在这里错过了什么吗?

是否有关于如何使用此功能的示例或建议?

非常感谢!

3 个答案:

答案 0 :(得分:0)

你是对的,while循环似乎只是用于测试发送速率。删除while循环后,documentation中的代码应该可以正常工作。

transporter.on('idle', () => {
    transporter.sendMail(...);
});

答案 1 :(得分:0)

来自documentation

  

SES可以忍受短暂的高峰,但是您不能真正一次清除所有电子邮件并期望它们能被发送。为了解决这个问题,您可以设置一个速率限制值,并让Nodemailer处理所有事情– 如果要传递的邮件太多,则Nodemailer会缓冲这些邮件,直到有机会进行实际的传递为止。

我认为监听idle事件不是强制性的,仅当您要避免Nodemailer缓冲消息时才需要。我的SES发送速率为每秒15条消息,并定期在Nodemailer一次发送250封电子邮件,并且没有遇到任何限制问题。

答案 2 :(得分:0)

您不需要 while 循环或 on idle 处理程序。只需设置singingRate,然后照常使用sendMail。

transporter = nodemailer.createTransport({
  SES: { ses, aws },
  sendingRate: 14,
});

const params = {
  from: 'EMAIL',
  to: 'EMAIL',
  subject: 'Message',
  html: 'I hope this <b>message</b> gets sent!',
  text: 'I hope this message gets sent!',
  // attachments: [{ filename: 'card.pdf', content: data, contentType: 'application/pdf' }],
};

transporter.sendMail(params, (err, info) => {
  if (err) {
    console.log(JSON.stringify(err));
  }
  console.log(info.envelope);
  console.log(info.messageId);
});

这里需要注意的重要一点是,nodemailer 等待下一秒继续处理下一批受限制的电子邮件和下一批,依此类推。因此,如果您正在运行一个在调用最后一个 sendMail() 后立即退出的脚本,则将永远不会发送受限制的电子邮件。通过在空闲时侦听或使用 settimeout 来确保该过程一直运行,直到所有电子邮件都发送完毕。