0

我正在为我们的客户开发一个使用 Mandrill 作为后端的群发邮件客户端。Mandrill 在他们的常见问题解答中指出 JSON 请求需要小于 10 MB。因此,我不能只将所有地址添加到单个请求中,而是需要在多个请求中发送它们。

我可以看到 2 种方法:或者将列表分成组(有一些缓冲区)并按组发送它们,或者一次将它们单独发送到每个地址。我不太喜欢第二种方法,因为这会向 Mandrill API 发送一些琐碎的请求,并可能让我被列入黑名单。第一个选项将限制 Mandrill API 接收的请求数量并减少我们自己网络的压力,但我不确定使用什么方法来拆分它们。

  • 当计数器达到某个数字时,使用带有计数器和特殊逻辑的 for 循环在我看来就像一个很容易破坏的 hacky 解决方案。
  • 将列表本身拆分成块并分别处理每个块是另一种选择,但我不太清楚如何解决。

我不知道这两种方法中最好的方法是什么,是否有更好的第三种方法,或者是否有关于群发邮件技术实施的一般指南。我已经对后一个主题进行了一些谷歌搜索,但没有什么真正有用的。


虽然建议的高级解决方案很有帮助,但我对将列表拆分为 1000-5000 个联系人的技术方面更感兴趣。有没有办法List<Contact>使用 C# 将任意大小的任意大小分成 4000 个联系人?

4

2 回答 2

1

您可能应该在 Mandrill 内部而不是在外部管理您的实际邮件列表、组和段 - 这样您就可以只向 API 发送一个请求并完成它。您甚至可以在 Mandrill 中设置预定的邮寄方式。

在任何情况下,是的,您可以将 List 拆分为任意段 - 一种方法是在导入 System.Linq 后使用 .Skip 和 .Take 方法:

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        IList<int> l = new List<int>();
        for(int i = 0; i < 5000; i++){
            l.Add(i);   
        }

        var a = l.Take(1000); //First 1000 items
        var b = l.Skip(1000).Take(1000); //Second 1000 items
        var c = l.Skip(2000); //Final 3000 items

        System.Console.WriteLine("a: " + a.Count());
        System.Console.WriteLine("b: " + b.Count());
        System.Console.WriteLine("c: " + c.Count());
    }
}

您可能最好编写一个扩展方法来处理这个问题,这样您就可以准确地指定每个段中应该有多少项目,但基本原则就在那里 - 它基本上与分页背后的想法相同。

于 2014-09-29T15:24:56.063 回答
0

大多数批量发送的用户通常将他们的列表分成 1000-5000 个收件人的批次,因为这个数量的收件人可以利用批量发送来平衡(这可以显着提高您收到电子邮件给我们的速度,因为您没有单独打开每个收件人的连接),虽然仍然足够小,以至于如果有需要进一步排除故障的问题,您就不会为更多的收件人挖掘信息。发送个人电子邮件是不被禁止的,也不会让你被 Mandrill 列入黑名单,特别是 - 很多发件人这样做是因为他们发送交易性或高度个性化的电子邮件。但是,如果您通常发送相同的内容,这对您来说效率低下。批处理大大增加了您一次可以发送给我们的数量,然后 Mandrill 将处理拆分收件人列表并有效地排队邮件。您可能还需要确保preserve_recipients在批处理时将参数设置为 false,尤其是在单个 API 调用中发送给数千个收件人的情况下。

于 2014-09-25T02:33:38.930 回答