procmailrc-更改电子邮件主题

procmailrc-更改电子邮件主题

我想通过在其主题中添加 [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比较两个字符串确实非常低效,而且通常很糟糕。

相关内容