【问题标题】:Process mail bursts one at a time一次处理一封突发的邮件
【发布时间】:2015-02-06 00:08:33
【问题描述】:

我们从 IDS 收到大量邮件,我们正在对这些邮件进行后处理以创建事件报告,将它们转发到请求跟踪器等。现在,我们有一个脚本可以根据 / 中的规则执行 procmail 调用的所有后处理等/别名。比如:

ids-report: "|/opt/ids/process.pl"

现在的问题是,由于邮件突发而运行此脚本的许多实例可能会导致内存耗尽和一些令人讨厌的同步问题。

在我的脚本中,我尝试使用 Sys::RunAlone,但发现它并不理想。

我希望 procmail 一次从队列中为我的脚本提供一封邮件,但我还没有找到方法。

你们有什么想法,我该怎么办?开箱即用的解决方案也受到欢迎...

谢谢。

【问题讨论】:

    标签: perl email sendmail procmail


    【解决方案1】:

    为什么不在收到邮件后立即将它们保存到文件或数据库中,并从另一个脚本一次处理一个保存的记录?

    如果您发布一些代码,您可能会收到更多(并且可能更好)的答案:)

    【讨论】:

    • 这就是我们在工作场所使用的监控解决方案。 Procmail 将传入的警报邮件放入队列中,一个守护进程监视队列目录,产生工作人员来处理邮件。
    • 我想避免另一个数据库间接。收到的邮件会一直保存到送达为止。所以它已经是某种数据库,我想使用它。 Tripleee 的答案可能最接近我想要的。但如果它不起作用,我将不得不求助于另一个数据库层。恐怕我无法发布代码。尤其是那些导致我的问题的瓶颈高度依赖于我们的基础设施。
    【解决方案2】:

    我第二个 Georgi Rangelov's answer 但如果您认真询问如何在 Procmail 中一次只运行一条消息,答案是使用锁定文件。

    :0:only1.lock
    | /opt/ids/process.pl
    

    这意味着,如果文件only1.lock 存在,请等待。一旦它消失了,创建它,运行管道,然后在完成后删除锁定文件。

    另见http://porkmail.org/era/procmail/mini-faq.html#locking

    【讨论】:

    • 谢谢,这似乎最接近我的想法。我只是想知道这个解决方案是否存在问题(例如,性能)。
    • 是的,序列化曾经是并行的东西会花费更多时间。只要您平均可以在下一次突发之前完成队列,就不会出现拥塞。如果你不能,也许你可以弄清楚如何最小化临界区——也许将脚本模块化成更小的脚本,其中大部分可以并行运行,或者使用一些 Perl 互斥机制处理脚本内部的锁定。或者准备购买更多硬件,或者丢失一些信息。
    【解决方案3】:

    “IMAP 空闲”邮箱作为电子邮件消息的缓冲区/管道

    您可以将邮件投递到 IMAP 邮箱。您可以将fetchmail 与--idle(实时处理)和--mda(执行脚本)结合使用。

    您可以像使用dovecot 一样使procmail 将消息传递到maildir 即使没有运行守护程序,以允许fetchmail 使用IMAP 协议访问maildir。

    附:如果您有兴趣,我可能会提供更多详细信息。 AFAIR 我曾用它来处理我的垃圾邮件陷阱服务器捕获的垃圾邮件。

    【讨论】:

    • 有趣的解决方案。如果上述方法失败了,我一定会尝试并稍后回复您。
    猜你喜欢
    • 2018-02-07
    • 2014-07-27
    • 2016-03-09
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多