procmail 忽略用户设置

procmail 忽略用户设置

我使用 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:理解问题的最好方法是尝试向别人解释它:))

相关内容