我使用 procmail 结合 postfix 过滤电子邮件。procmail 由 postfix 通过 main.cf 中的mail_command触发
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 充当用户女巫,结果在没有 -d 的情况下传递工作,它传递到 /var/mail/ 在这里我们更接近点我不明白。
仅当用户的主文件夹中有 .prcocmailrc 时,打开 DROPPRIVS 似乎才有效,因为我可以在那里定义传递到 /home/ 否则邮件将传递到 /var/mail/ 并且它是 mbox 格式而不是 maildir 格式
我想解决方法在 /etc/procmailrc 中是这样的(伪代码示例)
if exist /home/<username>/.procmailrc
set DROPPRIVS=yes
else
set DROPPRIVS=no
我如何用 procmail 语言写这个?
解决方案似乎是这样的
它工作得很好,但似乎有一个错误在日志文件中写入以下内容
我无法理解是谁设置了这个 VERBOSE=off,因为它不在我的 procmailrc 中,它似乎在传递代码的某个地方。
无论如何,在这一行之后,它会正确跳转到用户 .procmailrc 并执行它而不会失败。所以这个失败似乎只是一个表面上的失败。
PS 理解问题的最好方法是尝试向其他人解释它:))