我使用 procmail 与 postfix 结合来过滤电子邮件。procmail 由 postfix 通过 main.cf 触发邮箱命令
mailbox_command = /usr/bin/procmail -t -a "$EXTENSION"
但在 master.cf 中
procmail unix n n - 20 pipe
flags=R user=vmail argv=/usr/bin/procmail -o SENDER=${sender} -m USER=${user} EXTENSION=${extension}
我不太明白,但在我看来,这两个不是同一个命令,这种情况是否可能是procmail忽略/home/user/.procmailrc中的用户设置的原因?
如果我们查看 procmail 日志,我们会看到
From info@some_spam_domain.com Sat Mar 1 17:10:24 2014
Subject: ***** SPAM 27.4 ***** Hi i'm Masha 22 yo. do you have web camera?
Folder: /usr/lib/dovecot/deliver -m Junk -d hans 4202
它实际上是使用 dovecot 来发送电子邮件。hans 是一个用户,JUNK 是一个在主 /etc/procmailrc 中定义的文件夹,如下所示
DROPPRIVS=no
DELIVER="/usr/lib/dovecot/deliver"
SPAMORDNER="$DELIVER -m Junk -d $USER"
:0 w
* ^X-Spam-Status: Yes
| $SPAMORDNER
我的 procmailcf 中有
DROPPRIVS=no
DROPPRIVS=no 与 -d 一起使用,但会关闭用户 .procmailrc DROPPRIVS=yes 强制 procmail 充当用户,结果是 deliver 在没有 -d 的情况下工作,并且它会传递到 /var/mail/ 而在这里我们更接近我不明白的点。
启用 DROPPRIVS 似乎仅当用户主文件夹中有 .prcocmailrc 时才有效,因为我可以在那里定义发送到 /home/,否则邮件将发送到 /var/mail/,并且采用 mbox 格式而不是 maildir 格式
我认为解决方法应该是这样的(伪代码示例)在 /etc/procmailrc 中
if exist /home/<username>/.procmailrc
set DROPPRIVS=yes
else
set DROPPRIVS=no
我如何用 procmail 语言编写此内容?
答案1
解决方案似乎是这样的
TMPFILE="$HOME/.procmailrc"
:0 w
* ?test -f $TMPFILE
{
DROPPRIVS=yes
}
:0 Ew
* !test -f $TMPFILE
{
DROPPRIVS=no
}
它运行完美,但似乎有一个错误,在日志文件中写入以下内容
procmail: Executing "test -f $TMPFILE"
procmail: Match on "test -f $TMPFILE"
procmail: Assigning "DROPPRIVS=yes"
procmail: Assuming identity of the recipient, VERBOSE=off
procmail: Program failure (75) of "/usr/lib/dovecot/deliver"
我无法理解是谁设置了这个 VERBOSE=off,因为它不在我的 procmailrc 中,它似乎是在交付代码的某个地方。
无论如何,在这行之后它会正确跳转到用户.procmailrc并执行它而不会失败。所以这个失败似乎只是一个表面的失败。
PS:理解问题的最好方法是尝试向别人解释它:))