我想通过在其主题中添加 [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 可以完美运行,但很难管理。
答案1
我无法重现您的问题,并且您没有发布任何诊断,但我可以建议一个不同的方法,这可能会避免一些可能的错误情况。
没有理由重复List-Unsubscribe:
括号内的条件——如果你在括号内,你就知道它匹配了。
对路径进行硬编码的惯例formail
看起来很笨重(并且您在调用它的某个地方没有做到这一点)但是如果 Procmail 被调用时真的很奇怪,那么PATH
当您没有完全指定路径时,这可能是您看到失败的原因/usr/bin/formail
。
无论如何,您都希望尽可能避免外部流程。Procmail 可以提取主题:标头MATCH
,然后您只需一次formail
调用即可使整个配方成功。
:0 hfw
* ^List-Unsubscribe:
* ^Subject:\/.+
| /usr/bin/formail -i "Subject: [BULKMAIL]$MATCH"
特殊操作符\/
使 Procmail 将匹配的字符串收集到变量中MATCH
,然后我们使用该变量而不是formail -xSubject:
您正在运行的外部变量。这几乎不是一个关键的变化,但应该更高效,也更易于阅读和调试。
(第一个正则表达式中的尾随通配符.*
是多余的;只要在一行中的任何位置找到匹配项,Procmail 就会感到满意。)
您可以从命令行进行测试(但这当然要求您的配方文件不会覆盖DEFAULT
):
root@vbvntv-docker:/# procmail DEFAULT=/dev/null VERBOSE=yes </tmp/nst.eml
procmail: [937] Thu Dec 1 06:57:20 2016
procmail: Rcfile: "/etc/procmailrc"
procmail: Assigning "PATH=/usr/local/bin:/usr/bin:/bin"
procmail: Match on "^List-Unsubscribe:"
procmail: Assigning "MATCH="
procmail: Matched " testing"
procmail: Match on "^Subject:\/.+"
procmail: Executing " /usr/bin/formail -i "Subject: [BULKMAIL]$MATCH""
procmail: Assigning "PATH=/root/bin:/usr/local/bin:/usr/bin:/bin"
procmail: Assigning "LASTFOLDER=/dev/null"
procmail: Opening "/dev/null"
procmail: Notified comsat: "root@0:/dev/null"
From foo@bar Thu Dec 1 06:57:20 2016
Subject: [BULKMAIL] testing
Folder: /dev/null 133
如果您仍然无法解决这个问题,那么用类似的文字记录更新您的问题将非常有帮助。您可以在以下网址找到更多故障排除提示:http://www.iki.fi/era/mail/procmail-debug.html
一旦您对代码的运行感到满意,也许您会想要选择formail -I
现在在标题中formail -i
毫无用处的代码。Old-Subject:
(您的散文描述是这样的BULK
,但是代码却是这样的BULKMAIL
。如果您的代码是错误的,那么显然很容易更改。)
Webmin 的东西确实很糟糕,但显然这不是你自己的代码。有人应该向 Webmin 人员提供提示,Procmail 包含正则表达式引擎,因此调用来/bin/test
比较两个字符串确实非常低效,而且通常很糟糕。