在C#4.0中订购电子邮件的最佳方法,最大限度地延迟并防止可能出现的虚假垃圾邮件警报

在C#4.0中订购电子邮件的最佳方法,最大限度地延迟并防止可能出现的虚假垃圾邮件警报,c#,wpf,email,c#-4.0,C#,Wpf,Email,C# 4.0,我会给我所有的注册玩家发一封非常重要的公告邮件。现在我想订购数据库中的所有电子邮件。这个订单将是 first@hotmail.com first@gmail.com first@yahoo.com first@mymail.com 然后第二排开始 second@hotmail.com second@gmail.com second@yahoo.com second@mymail.com 订单的目的是以最大可能的延迟向域发送电子邮件。(向@domain1、@domain2、…@domain99

我会给我所有的注册玩家发一封非常重要的公告邮件。现在我想订购数据库中的所有电子邮件。这个订单将是

first@hotmail.com
first@gmail.com
first@yahoo.com
first@mymail.com
然后第二排开始

second@hotmail.com
second@gmail.com
second@yahoo.com
second@mymail.com
订单的目的是以最大可能的延迟向域发送电子邮件。(向@domain1、@domain2、…@domain99、@domain1、@domain2发送电子邮件,重复。我只会下一次订单,所以所需时间并不重要。我收到了大约32万封电子邮件。


我想用c#4.0 wpf应用程序实现这一点。最好的方法是什么。你可以假设每封电子邮件都有id。这将使订购更容易。

这将对你的电子邮件地址进行排序,假设这里的可变电子邮件是一个
IEnumerable。


但是,根据电子邮件和域的组合数量,您可能仍然会以过快的速度迭代此结果集,使电子邮件主机不会崩溃,因此您可能还希望在处理循环中增加一些延迟。

这将对您的电子邮件地址进行排序,假设此处的变量电子邮件是
I可枚举。


但是,根据电子邮件和域的组合数量,您可能仍然会以过快的速度迭代此结果集,以使电子邮件主机不会崩溃,因此您可能还希望在处理循环中增加一些延迟。

这里有一种方法,但它要求您存储额外的
邮购每个用户记录的ld

浏览每个用户记录并将其id添加到列表中,其中每个子列表包含特定主机的电子邮件地址。因此,您将有一个列表用于
gmail.com
,一个列表用于
yahoo.com
,等等

计算“最短”列表的长度,其长度超过某个合理的最小值,这样列表中的项目数就不会超过该短列表中项目数的2倍或3倍。对于每个列表,使用列表长度上限除以“最短”列表的长度,计算每轮从该列表中获取的地址数列表。它应不小于1。为列表
i
调用此itemCounti

mailOrder
设置为0

浏览列表列表,从每个列表中提取第一个itemCounti id
i
,并使用
mailorder
变量的值更新相应记录的
mailorder
字段。将
mailorder
递增一次并重复,直到所有列表都用完

发送电子邮件时,请按
mailorder
列对用户记录进行排序(最好在此列上有一个索引以使其快速)。定期重新运行算法以说明新用户的情况,这些新用户可以获得比最大
mailorder
多一个的临时
mailorder


另一种可能更好的方法是,在列表用尽之前,在每轮列表中接收固定的最大电子邮件数,并向特定主机的所有地址发送一封电子邮件(可能使用密件抄送)在每一轮中立即发送。这将有助于最大限度地减少您实际发送的电子邮件数量。根据您可以安全发送到该邮件主机而不会超出其限制的内容选择每轮的地址数。

这里有一种方法,但它要求您在每个用户记录中存储一个额外的
mailorder
字段

浏览每个用户记录并将其id添加到列表中,其中每个子列表包含特定主机的电子邮件地址。因此,您将有一个列表用于
gmail.com
,一个列表用于
yahoo.com
,等等

计算“最短”列表的长度,其长度超过某个合理的最小值,这样列表中的项目数就不会超过该短列表中项目数的2倍或3倍。对于每个列表,使用列表长度上限除以“最短”列表的长度,计算每轮从该列表中获取的地址数列表。它应不小于1。为列表
i
调用此itemCounti

mailOrder
设置为0

浏览列表列表,从每个列表中提取第一个itemCounti id
i
,并使用
mailorder
变量的值更新相应记录的
mailorder
字段。将
mailorder
递增一次并重复,直到所有列表都用完

发送电子邮件时,请按
mailorder
列对用户记录进行排序(最好在此列上有一个索引以使其快速)。定期重新运行算法以说明新用户的情况,这些新用户可以获得比最大
mailorder
多一个的临时
mailorder


另一种可能更好的方法是,在列表用尽之前,在每轮列表中接收固定的最大电子邮件数,并向特定主机的所有地址发送一封电子邮件(可能使用密件抄送)在每一轮中立即发送。这将有助于最大限度地减少您实际发送的电子邮件数量。根据您可以安全发送到邮件主机而不超过其限制的内容选择每轮的地址数。

您可以详细说明您正在尝试做什么吗?您是在尝试按邮件标题中的外观排序,还是正在发送32万封单独的电子邮件?这么多的电子邮件对我来说听起来很可疑。当我读到这个问题时,听起来OP希望发送32万封单独的电子邮件,并且在发送另一封邮件到同一个域之间有尽可能长的时间,这样垃圾邮件过滤器就不会捕获邮件。亚当·温格你理解正确。你能详细说明你的想法吗你是想做什么?你是想在标题中排序它们的外观,还是你发送了32万封单独的电子邮件?那么多电子邮件对我来说听起来很可疑。当我阅读问题时,它
email
    .OrderBy(e => e.Split(new char[] { '@' }, StringSplitOptions.RemoveEmptyEntries).ElementAt(0))
    .ThenBy(e => e.Split(new char[] { '@' }, StringSplitOptions.RemoveEmptyEntries).ElementAt(1));