procmail 配方将电子邮件过滤到多个文件夹

procmail 配方将电子邮件过滤到多个文件夹

目前我的procmail配方如下:

 FROM_=`formail -c -x"From "| awk '{ print $1 }'`

 SUBJ_=`formail -c -x"Subject:" | sed -e 's/^[ ]*//g' -e 's/[ ]*$//g'`

 :0
 *^Subject:.*(60)
 {
  :0 fwh
  | formail | (echo "$FROM_"; echo "$SUBJ_";)

  :0 fwb
  | formail -I ""

  :0
  myemail/
 }

我的 procmail 配方只会过滤掉主题中包含数字“60”的电子邮件。之后,formail 将执行提取发件人的电子邮件地址及其主题的操作,然后将其连同其内容一起转发到“myemail”目录。

如果主题中有多个用逗号分隔的“60”,有人可以帮我构建一个 procmail 配方来将收到的邮件过滤到不同的目录中吗?

(例如,主题为 6010、6011、6012 的电子邮件,... 6010 将进入 6010 文件夹,6011 将进入 6011 文件夹,依此类推。)

主题中的数字是电话号码,可能有大量不同的数字,因此列举所有可能的匹配实际上并不是一个选择。

答案1

如果您的邮箱是目录,您可以在一个投递操作中列出所有邮箱。然后一切都变得非常简单

:0
* ^Subject:.*60
`formail -zxSubject: | egrep -o 60[0-9]+ | sed 's%$%/%'`

反引号中的脚本将输出类似60123456789/(newline) 609876543210/(newline) 的内容 - 与电话号码一样多;每个都被视为文件夹名称,并且消息将传递到所有这些文件夹。

(我确信egrep | sed可以将其重构为单个sed脚本。每个文件夹名称后添加斜线是必要的,这样 Procmail 才能将传递操作视为目录传递。您不能同时传递到多个 mbox 文件夹中。)

我原来的回答如下。


您所问的问题在 Procmail 中相当棘手。没有用于循环一组匹配的工具。一个有点绝望的解决方法是将匹配收集到一个变量中,然后收集INCLUDERC=到另一个配方文件中,该文件将从变量的开头处理一个值,然后SWITCHRC=在变量中剩余值时再次收集到自身。它不必非常复杂,但它显然很黑客,以至于您不得不问 Procmail 是否真的是适合这项工作的工具。

当然,还有蛮力选项;创建一系列配方来处理每种可能的 60xx 模式。

:0c
* ^Subject:.*6000
myinbox/6000/

6001、6002 等。这假定您拥有的数量有限,或者如果您需要处理从 00 到 99 的每个情况,也许可以使用简单的脚本生成配方。

perl -e 'printf ("%02i\n", $_) for 0..99' |
while read i; do
    cat <<____HERE
    :0c
    * ^Subject:.*60$i
    myinbox/$i/
____HERE
done >60xx.rc

相关内容