2

试图弄清楚如何有一个 .procmailrc 规则来扔掉所有回复以前看到的邮件的邮件。使用 maildir,并希望规则涵盖 cur/ 或 new/... 中的消息

我应该让 procmailrc 解析所有文件吗?或者我应该有一个规则来提取消息 ID 标头,将它们转储到文件中并解析它?

我不能只检查和扔任何带有 in-reply-to 标头的东西,就好像它是对该地址尚未看到的东西的回复,它需要被接受。

4

1 回答 1

2

您需要从传入消息中收集 Message-Id:s 的缓存:

:0c:
| formail -zxMessage-Id: >>msgid.txt

然后检查 In-Reply-To: 是否针对此缓存(可能在您的早期,.procmailrc以便您可以在将 Message-Id 添加到缓存之前过滤垃圾邮件);

:0
* ? formail -zxIn-Reply-To: | fgrep -f msgid.txt -
./whitelisted

另请参见formail -D比较的示例。也许您可以将事物处理成可以实际formail -D用作后端的形式(在添加到缓存之前将 Message-Id: 替换为 From: ;拆分 In-Reply-To: 并对每个 message-id 执行类似的替换)。 formail可以维持一个恒定大小的 LRU 缓存,而fgrep文件将无限期地继续增长(尽管在这种情况下,也许这正是您想要的)。

当你最初设置它时,你可能想从你已经拥有的消息中收集一个缓存curnew但在那之后,你应该不需要再次从你的配方中引用这些消息。(如果你的收件箱和我的一样,那么实时抓取整个收件箱是不可行的。)

如果你想要一个大缓存,用 SQLite 或其他东西替换纯文本文件可能值得研究。实际上,当一个合适的数据库真正值得付出努力时,你可能想要一个真正的数据库而不是 SQLite,但我对这类事情的不同数据库引擎的可扩展性只有模糊的想法,没有实践经验。

请注意——除非你有一个不寻常的设置——你传出的 Message-Id:s 不会被添加到缓存中;为了让它真正有用,也许你应该安排以某种方式发生,和/或建立一个与你传出的 Message-Id:s 匹配的模式(理想情况下没有误报,当然也没有误报。如果你已经切换了 MUA过去,如果您想要全面覆盖,您或许应该单独寻找旧消息的模式)。

注意:未经测试,我可能很生疏。

于 2011-09-08T07:19:12.477 回答