![procmail 配方将电子邮件过滤到多个文件夹](https://linux22.com/image/797902/procmail%20%E9%85%8D%E6%96%B9%E5%B0%86%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E8%BF%87%E6%BB%A4%E5%88%B0%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E5%A4%B9.png)
目前我的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