背景
我们正在构建一个将处理&通过Mailgun发送电子邮件。这些有时是一次性消息,由事务启动。但是,有些电子邮件会立即发送到30k +。
例如,所有成员的简报。
考虑
Mailgun为其API提供Batch Sending选项。使用"收件人变量",您可以包含与特定用户配对的动态值。
但是,此批量发送功能有限。每个请求不能发送超过1,000个收件人,这意味着我们必须遍历每个1,000的收件人列表(在我们的数据库中)。 Mailgun provides an example如何使用Python(向下滚动约2/3)。
问题
批量发送是否有任何好处(即,使用收件人变量通过单个API调用向一组收件人发送电子邮件),而不是进行自己的循环,变量替换和单个API调用?
我认为这对我们的服务器来说更加沉重,因为它会处理每条消息本身,而不是仅仅将所有数据卸载到Mailgun的服务器上以便在他们的终端上进行繁重的工作。但我也喜欢灵活性和简单处理我们的结果并发送"完全呈现"邮件给Mailgun,一次一个,而不必一次迭代1k。
有关最佳做法的想法或我们应该考虑的因素吗?
答案 0 :(得分:6)
今天偶然发现了这一点,觉得它为我原来的问题提供了一个很好的总结/答案。我想发布这个作为答案,以防其他人有这个问题并且没有找到这个Mailgun帖子。也直接从马的嘴里出来。坚果壳版本:
对于PHP,至少SDK有一个Mailgun
类,并带有BatchMessage()
方法。这实际上处理了对您的收件人计数,因此您可以根据需要排队多个电子邮件地址(即超过1k),并且Mailgun将根据需要启动到API端点。很漂亮!
这是他们原来的措辞,加上页面的链接 Sending a message with Mailgun PHP SDK + Batch Message:
批处理消息
除Message Builder外,我们还有Batch Message。这个班 允许您构建消息并提交模板消息 批次,每个帖子最多1,000个收件人。使用它的好处 class是收件人计数被监控并将自动进行 添加第1,000个时,将消息提交给端点 接受者。这意味着您可以构建消息并开始迭代 通过你的数据库。忘记发送消息,SDK会 在必要时跟踪发布到API。
// First, instantiate the SDK with your API credentials and define your domain. $mgClient = new Mailgun("key-example"); $domain = "example.com"; // Next, instantiate a Message Builder object from the SDK, pass in your sending domain. $batchMsg = $mgClient->BatchMessage($domain); // Define the from address. $batchMsg->setFromAddress("dwight@example.com", array("first"=>"Dwight", "last" => "Schrute")); // Define the subject. $batchMsg->setSubject("Help!"); // Define the body of the message. $batchMsg->setTextBody("The printer is on fire!"); // Next, let's add a few recipients to the batch job. $batchMsg->addToRecipient("pam@example.com", array("first" => "pam", "last" => "Beesly")); $batchMsg->addToRecipient("jim@example.com", array("first" => "Jim", "last" => "Halpert")); $batchMsg->addToRecipient("andy@example.com", array("first" => "Andy", "last" => "Bernard")); // ...etc...etc... // After 1,000 recipeints, // Batch Message will automatically post your message to the messages endpoint. // Call finalize() to send any remaining recipients still in the buffer. $batchMsg->finalize();
答案 1 :(得分:1)
@cdwyer和@nikoshr的答案非常有帮助,但有点陈旧。该示例中不推荐使用的方法。这是lib的当前用法:
$batchRequest = $this->mailgun->messages()->getBatchMessage('mydomain.com');
$html = '<html>...</html>';
$batchRequest->setFromAddress('user@domain.com');
$batchRequest->setReplyToAddress('user2@domain.com');
$batchRequest->setSubject('Contact form | Company');
$batchRequest->setHtmlBody($html);
foreach ($recipients as $recipient) {
$batchRequest->addToRecipient($recipient);
}
$batchRequest->finalize();
更多信息,请访问documentation。