Postfix

procmail 忽略使用者設置

  • March 2, 2014

我使用 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 語言寫這個?

解決方案似乎是這樣的

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 理解問題的最好方法是嘗試向其他人解釋它:))

引用自:https://serverfault.com/questions/579192