如果标题有误导性,请注意。
我正在尝试编写一个程序来计算从不同的电子邮件ID发送的电子邮件的频率。我们需要根据发送的邮件数量和频率触发警报。例如,对于特定电子邮件,如果在过去60分钟内发送了超过25封邮件,则需要发送触发器。
基于另一个规则的另一个目录的不同触发器。基本规则是指在过去60分钟,180分钟,12小时和24小时内发送的邮件数量。我们如何提出计算频率并存储它的策略,而不会产生太多的系统/ CPU /数据库开销。
实际应用程序是一个传统的CRM系统。我们无法访问邮件服务器来破解Postfix或MTA中的内容。此外,还涉及多个域,因此任何在邮件服务器上执行操作的建议都可能无济于事。
我们可以访问每次发送邮件的尝试,并且可以查看录制它们。我的挑战是在一个大型的竞选活动中,数据库写入会频繁,并且会做一些实时数字处理资源密集型。我想避免这种情况并提出最佳解决方案
语言将是Python,因为CRM也是使用相同的语言编写的。
答案 0 :(得分:0)
尝试在客户端进行黑客攻击,将电子邮件尝试记录到日志文件中。然后,您可以阅读该文件以计算发送的电子邮件的频率。
我认为你可以把数据放在dict的内存中一段时间,比如前5分钟或10分钟。然后,您可以将数据发送到DB,从而不会对频繁写入的DB施加负担。如果您检查代码中的特定域的电子邮件突然激增,那么它可能会为您提供解决方案。
答案 1 :(得分:0)
设m是您的任何测试的最大阈值(发送的最大电子邮件数)。例如,如果您每24小时限制150封电子邮件,则m = 150(可能是短期检查的阈值都低于此值 - 每12个限制为200封电子邮件也没有意义小时)。你的最长时间是24小时,这意味着m不能超过25 * 24 = 600 - 因为如果是,那么一些检查将是多余的,每小时25封电子邮件限制。
由于这是每个用户的电子邮件数量相当少,我建议只保留一个每用户ring buffer,它只存储该用户发送的最后一个m< = 600条消息的日期和时间。每次用户发送新电子邮件时,请检查发送的最近25条消息的发送时间;如果它不到1小时前,发出警报。同样检查其他限制(例如,如果每180分钟还有50封电子邮件的限制,请检查超过180分钟前发送的最近50条消息)。如果所有测试都通过,则(over)使用当前日期/时间写入环形缓冲区中的下一个条目。日期/时间可以以4个字节存储,因此每个用户最多约2.4Kb字节,具有O(1)查询和更新。 (当然你可以使用数据库,但是环形缓冲区在内存中实现起来很简单,如果没有数百万用户,所需的总大小可能足够小。)