c# 4.0中排序邮件的最佳方法,以最大延迟和防止可能的虚假垃圾邮件警报

本文关键字:排序 最佳 方法 延迟 | 更新日期: 2023-09-27 18:15:07

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

first@hotmail.com
first@gmail.com
first@yahoo.com
first@mymail.com

则第二行开始

second@hotmail.com
second@gmail.com
second@yahoo.com
second@mymail.com

order的目的是以最大可能的延迟向域发送电子邮件。(给@domain1, @domain2,…@domain99, @domain1, @domain2,重复。我只下单一次,所以时间并不重要。我有32万封邮件。

我想用c# 4.0 wpf应用程序做到这一点。最好的办法是什么。你可以假设每封邮件都有id。

c# 4.0中排序邮件的最佳方法,以最大延迟和防止可能的虚假垃圾邮件警报

这将对您的电子邮件地址进行排序,假设这里的变量email是IEnumerable<string>.

email
    .OrderBy(e => e.Split(new char[] { '@' }, StringSplitOptions.RemoveEmptyEntries).ElementAt(0))
    .ThenBy(e => e.Split(new char[] { '@' }, StringSplitOptions.RemoveEmptyEntries).ElementAt(1));

然而,根据有多少电子邮件和域名的组合,您可能仍然要迭代这个结果集太快,以至于电子邮件主机不会崩溃,所以您可能还需要在处理循环中添加一些延迟

这是一种方法,但是它需要为每个用户记录存储一个额外的mailorder字段。

遍历每个用户记录并将其id添加到列表的列表中,其中每个子列表由特定主机的电子邮件地址组成。所以你会有一个gmail.com的列表,一个yahoo.com的列表,等等。

计算"最短"列表的长度,该列表长度大于合理的最小值,使得列表的项数不超过该短列表中的项数的2或3倍。对于每个列表,通过使用列表长度的上限除以"最短"列表的长度,计算每轮从该列表中获取的地址数量。它应该不小于1。调用这个itemCounti对于列表i

设置mailOrder为0

遍历列表的列表,从每个列表i中提取第一个itemCounti id,并用mailOrder变量的值更新相应记录的mailorder字段。

mailOrder增加1并重复,直到所有列表耗尽。

当您发送电子邮件时,按mailorder列对用户记录进行排序(最好在此上有一个索引,以使其简洁)。定期重新运行算法以考虑新用户,这些新用户可以获得临时mailorder, mailorder的最大值大于1。

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