Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果有超过一个请求所能容纳的地址数,我如何准备发送给Mandrill的邮件地址列表_C#_Mandrill_Massmail - Fatal编程技术网

C# 如果有超过一个请求所能容纳的地址数,我如何准备发送给Mandrill的邮件地址列表

C# 如果有超过一个请求所能容纳的地址数,我如何准备发送给Mandrill的邮件地址列表,c#,mandrill,massmail,C#,Mandrill,Massmail,我正在为我们的客户开发一个使用Mandrill作为后端的邮件群发客户端。在他们的FAQ中,Mandrill声明JSON请求需要小于10MB。因此,我不能只将所有地址添加到一个请求中,而是需要在多个请求中发送它们 我可以看到两种方法:要么将列表分成若干组(以便有一个缓冲区)并按组发送,要么一次将它们单独发送到每个地址。我真的不喜欢第二种方法,因为这会给Mandrill API发送一些琐碎的请求,并可能让我被列入黑名单。第一个选项将限制Mandrill API接收的请求数量,并减少我们自己网络上的压

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

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

  • 在我看来,当计数器达到某个数字时,使用带有计数器和特殊逻辑的for循环就像是一个容易被破解的黑客解决方案
  • 将列表本身拆分为块并分别处理每个块是另一种选择,但我不太知道如何解决这个问题
我不知道这两种方法中最好的方法是什么,是否有更好的第三种方法,或者是否有关于大规模邮件技术实施的一般指导原则。我在谷歌上搜索过后一个主题,但没有什么真正有用的



虽然建议的高级解决方案很有帮助,但我更感兴趣的是将我的列表分成1000-5000个联系人的技术方面。有没有一种方法可以将任意大小的
列表
拆分为多个联系人,比如说,4000个联系人,每个联系人使用C#?

大多数批量发送的用户通常会将其列表分为1000-5000个收件人,因为这一数量的收件人利用了批量发送的优势(这会显著提高您收到我们电子邮件的速度,因为您没有为每个收件人打开单独的连接),虽然仍然很小,如果存在需要进一步排除的问题,您没有挖掘更多收件人的信息。发送个人电子邮件并不是禁止的,也不会让您被Mandrill列入黑名单,特别是-许多发件人这样做是因为他们发送的是事务性的或高度个人化的邮件电子邮件无效。但是,如果您通常发送相同的内容,这对您来说效率很低。批处理大大增加了您一次可以发送给我们的数量,然后Mandrill将处理断开收件人列表并有效地对邮件进行排队。您可能需要确保设置
保留收件人
参数to批处理时也是错误的,特别是如果您在一个API调用中向数千个收件人发送邮件。

您可能应该在Mandrill本身而不是外部管理您的实际邮件列表、组和段-这样您就可以只向API发送一个请求并完成它。您甚至可以设置定时邮件在山楂树上

在任何情况下,都可以将列表拆分为任意段-一种方法是在导入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());
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
公共课程
{
公共静态void Main()
{
IList l=新列表();
对于(int i=0;i<5000;i++){
l、 加(i);
}
var a=l.Take(1000);//前1000项
var b=l.Skip(1000).获取(1000);//第二个1000项
var c=l.Skip(2000);//最终3000项
System.Console.WriteLine(“a:+a.Count());
System.Console.WriteLine(“b:+b.Count());
System.Console.WriteLine(“c:+c.Count());
}
}

您可能最好编写一个扩展方法来处理这个问题,这样您就可以精确地指定每个段中应该包含多少项,但基本原则是——分页的基本思想是一样的。

感谢您解释.Skip和.Take方法。在Mandrill中管理列表、组和段不是一个选项因为我们想要在Mandrill提供的功能之外对我们的联系人和邮件列表进行额外的控制。刚刚注意到我已经在Mailchimp和Mandrill之间建立了联系!不过,很高兴我能帮上一点忙:)