我们正在运行 SGE 作业调度系统。用户可以让 SGE 在作业被取消时发送电子邮件。如果用户有大量作业(例如 100'000k 个条目)并一次性终止所有作业(使用 非常容易qkill -u USER
),则用户的邮件帐户将被电子邮件淹没。
所有电子邮件似乎都是从 发送的[email protected]
,并且主题为"Job <numeric job id> (<name of script>) Killed"
。
所有电子邮件都通过配置为邮件代理的 Postfix 实例运行,它从所有节点收集作业,然后将它们转发到组织的实际邮件主机。
我想实现以下目标:
- 将所有电子邮件保留 30 秒,直到转发。
- 考虑过去 30 秒的电子邮件并检查是否有任何重复(相同
To:
,主题仅在数字职位 ID 上有所不同)。 - 如果收到超过 10 封类似的电子邮件,则:
- 创建一封“折叠”电子邮件,主题为“许多工作的折叠电子邮件()已删除”
- 显示前 5 封电子邮件的正文
- 然后显示
"And <number> similar emails were dropped"
- 将电子邮件时间设置为当前时间并放入队列。
- 如果这种情况多次发生,
<number>
则应相应增加上述数字。 - 然后应发送超过 30 秒的电子邮件。
我猜我没有找到正确的关键字,但我找不到合适的位置来挂载这样的脚本。这样的脚本的最佳位置在哪里?
我对编写这样的脚本没有任何问题,但如果有人知道现有的脚本,我会很感兴趣了解。
答案1
好吧,最后我通过编写一个解决了这个问题邮件过滤器其工作原理如下:
- 如果消息符合
From:
/Subject:
模式,则进一步处理。否则,直接接受。 - 在处理的情况下,将其与时间戳和字段一起放入sqlite数据库中
To:
。 - 如果在过去 Y 秒内有
==
X 条消息,则发送一条警告消息,告知收件人他们的电子邮件已被过滤/丢弃。 <
如果在过去 Y 秒内有X 条消息,则中继电子邮件。>
如果在过去 Y 秒内有X 条消息,则删除电子邮件。
当正确使用交易时,可以保证(1)在 Y 秒内发送的电子邮件不超过 X 封,并且(2)在达到阈值时可以发送一次“未来的电子邮件将被丢弃”的警告消息。
到目前为止,一切运行良好。
请注意,这也可以扩展为在爆发结束后将电子邮件合并为一个摘要,但最终我不愿意花时间来实现这一点。