我想通过添加 [BULK] 来更改所有订阅列表电子邮件的主题。看起来全局 /etc/procmailrc 文件是最好的地方。但是这个过滤器也会删除一些电子邮件的所有标题(我的更改用破折号分隔):
LOGFILE=/var/log/procmail.log
TRAP=/etc/webmin/virtual-server/procmail-logger.pl
:0wi
VIRTUALMIN=|/etc/webmin/virtual-server/lookup-domain.pl --exitcode 73 $LOGNAME
EXITCODE=$?
:0
* ?/bin/test "$EXITCODE" = "73"
/dev/null
EXITCODE=0
:0
* ?/bin/test "$VIRTUALMIN" != ""
{
INCLUDERC=/etc/webmin/virtual-server/procmail/$VIRTUALMIN
}
-----
:0
* ^List-Unsubscribe:.*
{
:0 hw
SUBJECT=| formail -xSubject:
:0 hfw
* ^List-Unsubscribe:.*
| /usr/bin/formail -i "Subject: [BULKMAIL] $SUBJECT"
}
-----
DEFAULT=$HOME/Maildir/
ORGMAIL=$HOME/Maildir/
DROPPRIVS=yes
使用此代码的用户主目录规则中的单个 .procmailrc 效果很好,但很难管理。
我无法重现您的问题,并且您没有发布任何诊断信息,但我可以建议一个不同的配方,这可能会避免一些可能的错误情况。
没有理由重复
List-Unsubscribe:
大括号内的条件——如果你在大括号内,你就知道它匹配。硬编码路径的约定
formail
似乎很笨拙(并且您在调用它的地方之一没有这样做)但是如果 Procmail 被调用时非常不稳定PATH
,这可能是您在不这样做时看到失败的原因完全指定路径/usr/bin/formail
。无论如何,您要尽可能避免外部流程。Procmail 可以提取 Subject: 标头
MATCH
,然后您只需要一次formail
调用即可使整个配方成功。特殊运算符
\/
使 Procmail 将匹配的字符串收集到变量MATCH
中,然后我们使用它而不是formail -xSubject:
您正在运行的外部。这几乎不是一个关键的变化,但应该更有效,并且更容易阅读和调试。(尾随通配符
.*
在第一个正则表达式中是多余的;如果在一行中的任何位置找到匹配项,则满足 Procmail 的要求。)您可以从命令行进行测试(但这当然要求您的配方文件不覆盖
DEFAULT
):如果您仍然无法使其正常工作,使用类似的成绩单更新您的问题可能会很有帮助。可以在http://www.iki.fi/era/mail/procmail-debug.html找到更多故障排除技巧
一旦您对您的代码工作感到满意,也许您会更喜欢哪个
formail -I
在标题formail -i
中留下现在相当无用的内容。Old-Subject:
(您的散文描述说
BULK
,但代码说BULKMAIL
。如果您的代码错误,显然很容易更改。)Webmin 的东西真的很糟糕,但显然它不是你自己的代码。有人应该向 Webmin 人员提供 Procmail 包含正则表达式引擎的提示,因此调用
/bin/test
来比较两个字符串确实非常非常低效,而且通常很可怕。