根据内容将邮件从一个收件箱拆分到另外 2 个收件箱

根据内容将邮件从一个收件箱拆分到另外 2 个收件箱

有没有一种方法可以通过 Postfix 和/或 procmail 或其他软件将电子邮件从一个收件箱转发到另外 2 个收件箱,其中每封邮件根据内容发送到一个收件箱或另一个收件箱。有时消息是多部分的,并且关键字位于第一部分内。

答案1

Procmail 本身没有任何功能来循环您已收到的消息,但它的配套formail实用程序可以循环 mbox 文件中的消息;或者,当然,如果您使用像 Maildir 这样的邮箱格式,您可以简单地循环包含这些消息的文件。

for file in ~/Maildir/cur/deadbeefdecafbadc001b00c ~/Maildir/cur/badc0415106644511745; do
    procmail -m testing.rc <"$file";
done

其中testing.rc可能包含类似的内容

:0
* ^Subject: (foo|bar)
! [email protected]

:0
! [email protected]

将匹配的消息发送到第一个地址,将其他消息发送到第二个地址。 (可能使用不向任何地方发送任何内容的规则进行测试!)

为了操作 mbox 文件,调用将类似于

formail -s procmail -m testing.rc <messages.mbox

要查看第一个 MIME 部分的内部,您基本上需要弄清楚如何将该部分提取为 Procmail 可以读取的内容。如果内容可能是 Base64,则需要一个 Base64 解码器,以及一些相当复杂的逻辑来隔离消息部分。也许到了那个时候,可以使用具有更好支持的第三方工具来检查现代 MIME 消息的内部结构吗?这是一个简单的 Python 工具。

from email import message_from_binary_file
from email.policy import default
import sys

for filename in sys.argv[1:]:
    with open(filename, "rb") as msg:
        message = message_from_binary_file(msg, policy=default)
    if "fnord" in message.get_body(preferencelist=('plain', 'html')).get_content():
        print(f"{filename}: there")
    else:
        print(f"{filename}: not there")

这只是根据是否找到搜索词来打印“那里”或“不在那里”。显然,您可以扩展它以将输入文件移动或复制到另一个目录,或者将消息发送到不同的地址,或者在 Python 脚本本身内执行其他操作;或者从 Bash 脚本运行它并响应其输出。

但回到 Procmail,如果您所需要的只是搜索一个简单的文本/纯文本部分,并且可以忍受不必要地搜索第一个部分之外的其他部分,也许这样说就足够了

:0B
* (\<fnord\>)
! [email protected]

(与我的 Python 示例不同,它演示了搜索短语周围的单词边界)。这仍然很脆弱,因为即使是引用的可打印消息也可能包含

Content-type: text/plain; charset="utf-8"
Content-transfer-encoding: quoted-printable

Annoyingly, QP lets you insert a newline in the midd=
le of a word, so you could end up not finding this f=
nord occurrence.

上面的简单 Python 工具可以很好地处理这个问题。

相关内容