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(...)
执行后它会无限循环。我在这里错过了什么吗?
是否有关于如何使用此功能的示例或建议?
非常感谢!
答案 0 :(得分:0)
你是对的,while循环似乎只是用于测试发送速率。删除while循环后,documentation中的代码应该可以正常工作。
transporter.on('idle', () => {
transporter.sendMail(...);
});
答案 1 :(得分:0)
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 来确保该过程一直运行,直到所有电子邮件都发送完毕。