AWS SES:如何发送大量电子邮件(一次> 10000)

Pho*_* Vu 3 node.js amazon-ses aws-lambda

我正在构建一个电子邮件发送服务(lambda,Nodejs),该服务将同时将电子邮件发送到地址列表。

由于要求:每个地址接收不同的电子邮件内容,我不能在一个请求中发送多个电子邮件,而是一个一个地发送。

_array = ... // list of address + html content, > 10000 records
for (var i = 0; i < _array.length; i++) {
    var params = {
        Destination: {/* required */
            ToAddresses: [_array[i].email]
        },
        Message: {/* required */
            Body: { /* required */
                Html: {
                    Data: _array[i].html,
                    Charset: 'UTF-8'
                },
            },
            Subject: { /* required */
                Data: 'Your order detail', /* required */
                Charset: 'UTF-8'
            }
        },
        Source: "mytestemail@email.com"
    }

    let send = await ses.sendEmail(params).promise();

}
Run Code Online (Sandbox Code Playgroud)

目前,我没有要测试的大数据,但是我测试了100-200封电子邮件,它可以正常工作,并且需要15-40秒才能完成发送电子邮件。从数学上来说,10000需要25分钟以上才能完成任务。因此,此方法不可扩展,因为15分钟的lambda超时限制

任何更好的方法或建议,表示赞赏。

编辑:

@Thales Minussi的解决方案很棒,我实现了它并且正在工作。我将其标记为答案,但是我仍然欢迎所有最佳实践解决此问题。开心地分享,学习和编码

Tha*_*ssi 6

不推荐:可以做的是并行sendEmail调用。因此,您可以创建大量Promises,然后使用await Promises.all(yourPromisesArray),因此Node.js会根据Lambda函数运行所在的计算机上可用内核的数量,尽最大努力优化流程。则需要将Lambda的RAM内存设置为3GB(计算机与RAM量成正比,这意味着您设置的RAM越多,代码运行的机器就越好)。但这还是有问题的到现在为止,我们谈论的是10000封电子邮件,但是如果这个数字增加到100000怎么办?1000000?这只是一个解决方案,其规模不足以满足其增长的需求,因此这还不够。另一件事是,如果出现问题(例如Promise失败),那么很难恢复。

推荐:我的建议是,使用SQS将创建电子邮件正文的功能与实际发送它的功能分离开,因为总的来说,与其说await ses.sendEmail(params).promise()是在上面进行操作,不如说是在讲,而是将消息发送到SQS队列中(遵守每条消息的256KB限制),并向该SQS队列订阅另一个Lambda。每个Lambda最多可以从SQS读取10条消息(每条消息可以包含许多电子邮件),这将大大加快该过程,尤其是因为默认情况下,您的Lambda函数可以扩展以满足需求。

让我们运行一个简单的数学运算:如果您向SQS发送100条消息,并且每条消息有10封电子邮件,这意味着,在最佳情况下,将增加10个Lambda,每个Lambda消耗一批10条消息,但是每条消息包含10条消息电子邮件,每个Lambda都会处理100封电子邮件,因此您眨眼即可处理1000封电子邮件!

重要的是要注意,并不是所有的Lambda每次都会拾取10个批次,它们可能会拾取较小的批次,因此有可能同时启动了10个以上的Lambda函数,但是我认为您可以并行处理

编辑:由于电子邮件可以由大量有效负载(图像,长字符串等)组成,我建议您仅将相关信息发送到SQS队列以优化有效负载大小。如果您需要处理图像或一些预定义的模板,只需在S3(或您可能使用的其他存储设备)中发送它们各自的位置,以便实际上负责发送电子邮件的Lambda就是获取该信息的那个。并将其添加到身体。本质上,您发送到SQS的消息应仅包含元数据,以使有效负载尽可能轻便,因此您可以利用256KB的限制。这样的事情足以让您动身:

{
    "to": "to@email.com",
    "images": ["s3://bucket/image.jpg", "s3://bucket/image2.jpg"],
    "template": "s3://bucket/template.html"
}
Run Code Online (Sandbox Code Playgroud)