如何将procmail过滤器应用于maildir收件箱?


9

昨晚我订阅了一个邮件列表,今天早上发现我的procmail过滤器不适用于许多邮件列表消息。现在,我的收件箱中夹杂着不那么重要的邮件列表消息和更重要的工作电子邮件。

是否可以通过procmail过滤器重新运行收件箱中的所有电子邮件?

注意:我使用的是maildir格式



这提供了部分解决方案。在这种情况下,某些电子邮件肯定会被路由回收件箱。似乎应该已经有一些我只是不知道的* nux解决方案,而不是编写脚本来模拟现有的邮件传递过程。
科里·克莱因

问题是procmail仅适用于邮件,不适用于文件夹,mbox或其他任何东西-这意味着您将不得不模拟传递使用雷鸟之类的东西并对其进行过滤。
Ulrich Dangel 2012年

Answers:


3

我相信这会起作用。您需要运行formail以重新格式化邮件并将其发送回procmail

从Maildir目录:

cat * | formail -s procmail


3
这真的有效吗?它不会将所有旧邮件保留在原处吗?
cnst

2

您可能可以就地执行此操作,如下所示:

$ for m in Mail/{cur,new}/*; do echo $m; procmail <$m; rm $m; done

之后,您必须删除每封原始电子邮件,否则procmail会将其重复。

它还会将所有内容记录为新内容。我不确定要解决这个问题的好方法。


这在光盘io上似乎是浪费的:procmail筛选通常仅基于标头进行,但是这样的管道传输将导致整个消息被重新读取并重新写入光盘。此外,如果procmail内存不足或遇到其他问题,您仍然可以无条件删除文件(哎呀!),这看起来也很可怕。我要说,就maildir而言,这是一个完全不可接受的解决方案。
cnst

1
可以通过这样做procmail < $m && rm $m来逐步改进,而不是procmail < $m ; rm $m这样,如果procmail失败,至少不会删除该消息。
rrauenza

2

如果您使用的是mutt,则可以通过procmail传递电子邮件,还可以使用以下类似的键盘命令从收件箱中删除原始邮件:

muttrc:

macro index y '<enter-command>unset wait_key<enter><tag-prefix><pipe-entry>/usr/bin/procmail /home/user/.procmailrc<enter><tag-prefix><delete-message><enter-command>set wait_key<enter>'

macro pager y '<enter-command>unset wait_key<enter><pipe-entry>/usr/bin/procmail /home/user/.procmailrc<enter><delete-message><enter-command>set wait_key<enter>'

https://mikeburnscoder.wordpress.com/2011/06/12/one-big-mutt-inbox-filtered-after-the-fact-using-procmail/上找到


1

似乎没有很好的解决方案:procmail似乎只接受来自的邮件输入stdin,这限制了maildir应用程序。

我遇到了类似的情况,最适合我需求的解决方案就是复制我想做procmail的事情,但是用我自己的小脚本绝对不能做的事情,如果您只有一个或两个简单规则,就足够了您需要注意的事项:

cd ~/Maildir/
sh -c 'for i in `egrep -l "^Delivered-To: perforce@freebsd.org" cur/*`; \
    do mv $i .FreeBSD.perforce/$i; done'

这也不是最佳选择,但至少它不应遭受不必要的IO和潜在的数据丢失问题的困扰。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.