如何用Procmail正则标记To字段不含指定字符串的邮件?
Procmail过滤To字段不含指定内容的解决方案
Procmail默认使用POSIX扩展正则表达式,确实不支持Perl兼容正则(PCRE)里的负向前瞻((?!...))这类零宽断言语法,这就是你之前尝试无效的原因。下面给你两种可行的解决方案:
方案一:排除式规则(推荐,简洁可靠)
利用Procmail规则从上到下执行的特性,先匹配并放行To字段包含“myname”的邮件,剩下的自然就是To不含“myname”的邮件,再对这些邮件执行过滤或标记操作。
示例配置:
# 放行To字段包含myname的邮件,跳过后续处理 :0 * ^To:.*myname CONTINUE # 让邮件继续走后续规则,或者用 /dev/null 直接丢弃(按需选择) # 针对To不含myname的邮件,执行过滤或标记 :0: * ^Subject:.*Derila # 保留你原有的主题过滤规则 filtered-mails/ # 归档到指定文件夹,替换成你的目标动作 # 如果是添加标记(比如自定义邮件头) :0 fhw | formail -A "X-Filter-Tag: Non-Myname-Recipient"
如果需要同时排除Cc字段包含“myname”的邮件,只需在放行规则里添加条件:
:0 * ^To:.*myname * ^Cc:.*myname CONTINUE
方案二:POSIX正则实现“不包含”(繁琐,仅作参考)
通过构造POSIX兼容的正则来匹配To字段中完全不出现“myname”的内容,这种写法需要逐个字符排除匹配,适合短字符串,长字符串容易出错:
:0: * ^To:.*([^m]|m[^y]|my[^n]|myn[^a]|myna[^m])*$ # 执行你的过滤/标记动作 target-folder/
内容的提问来源于stack exchange,提问作者ff-webdesigner
相关产品推荐
相关产品推荐

