如何使用procmail拆分单个邮件?

时间:2019-07-04 12:03:38

标签: bash email split procmail fetchmail

我有一个隔离文件夹,我必须定期将其下载并按收件人收件箱进行拆分,甚至更好地将每个邮件拆分为文本文件。我有每天10.000封邮件,我正在使用fetchmail和procmail进行编码。问题是我不知道如何在procmail中按消息拆分消息。它们都放在同一个收件箱中。

我试图通过以下配方传递脚本中的所有消息:

    :0
    | script_processing_messages.sh

其中包含

    read varname
    echo "$varname" > test_file

要尝试查看是否可以在$ varname变量中获得一条消息,但不能,我每次只能获得一条消息。

我现在使用

    fetchmail --keep

.fetchmailrc在哪里

    poll mail.mymta.my protocol pop3 username "my@inbox.com" password "****" mda "procmail /root/.procmailrc"

.procmailrc是

    VERBOSE=0
    DEFAULT=/root/inbox.quarantine

我想为每个消息获取一个文件,所以:

1.txt
2.txt
3.txt
[...]
10000.txt

我有很多收件人和多个域,所以我不能说写5000条规则来匹配每个收件人。如果有某种

^To: $USER 
重定向到

/$USER.inbox

以便procmail本身负责阅读和创建这些收件箱的动态

我不是fetchmail和procmail食谱方面的专家,我正在努力尝试,但我没有走那么远。

2 个答案:

答案 0 :(得分:1)

您似乎有两个或三个不同的问题;关于Stack Overflow的适当礼节是分别询问每个人-这还可以帮助那些只遇到您问题之一的未来访客。

首先,要拆分包含多个消息的Berkeley mbox文件并分别对每个消息运行Procmail,请尝试

formail -s procmail -m <file.mbox

您可能需要阅读mailbox formats supported by Procmail。 Berkeley邮箱是一个包含多个消息的文件,仅用From开头的行分隔(四个字母字符后有空格)。该分隔符必须是唯一的,因此,需要以某种方式转义包含在正文行首的那五个字符的消息(通常是在>之前写一个From)。

要将每个邮件保存在单独的文件中,请选择与单一文件Berkeley格式不同的邮箱格式。具体而言,如果目标位置是目录,则Procmail将在该目录中创建一个新文件。新文件的确切命名方式取决于目录的内容(如果它包含Maildir子目录newtmpcur,则在{{1}中创建新文件}(按照Maildir的命名约定),以及如何精确指定目录(后跟斜杠和点选择MH格式;否则为邮件目录格式)。

每个收件人保存到一个邮箱会有很多讨厌的情况。如果邮件发送给您的多个本地收件人怎么办?如果收件人地址在标题中不可见怎么办?等等(在域的虚拟主机的上下文中,Procmail Mini-FAQ具有a section about this,这基本上是其变体)。但是,如果我们只是忽略这些,则可以使用类似的

new

这将捕获与正则表达式匹配的第一个地址到:0 # whitespace before ] is a literal tab * ^TO_\/[^ @ ]+@(yourdomain\.example|example\.info)\> { # Trim domain part from captured MATCH :0 * MATCH ?? ^\/[^@]+ ./$MATCH/ } 中,然后对捕获的字符串执行另一个正则表达式匹配,以捕获$MATCH符号前的部分。显然,这显然要求您要匹配的地址都在一组特定的域中(在这里,我使用了@yourdomain.example;显然是用您的实际域名替换了这些地址),并捕获了第一个匹配项地址就足够了(因此,如果一条消息是example.infoTo: alice@yourdomain.example,则该配方将选择最接近消息顶部的任何一个,而忽略另一个)。

更详细地讲,Cc: bob@example.info特殊标记使Procmail在此点之后将与正则表达式匹配的文本复制到内部变量\/中。如本食谱所示,您然后可以对该变量本身执行正则表达式匹配以提取它的子字符串(或换句话说,丢弃捕获的匹配的一部分)。

操作MATCH使用./$MATCH/中捕获的字符串作为要保存到的文件夹的名称。前导MATCH指定当前目录(等于Procmail变量./的值),后缀MAILDIR选择邮件目录格式。

如果不能将您的预期收件人限制在一组特定的域中或通过单个正则表达式进行匹配,我的建议是提出一个范围更有限的新问题,并提供足够的详细信息以实际标识您想要的内容完成。

答案 1 :(得分:0)

我找到了部分问题的解决方案。

似乎procmail中没有办法让procmail本身识别For收件人而不在配方中指定它,因此我只是获得了一个列表并创建了一个巨大的配方文件。

但是后来我才发现,要保存一封邮件并避免装满大量邮件的巨大邮箱,可以写一个如下的食谱:

:0
* ^To: recipient@mail.it
/inbox/folder/recipient@mail.it/

请注意最后的/:这将使procmail创建文件夹结构,而不是将每个文件都写入单个文件中。

相关问题