procmail 忽略使用者設置
我使用 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 理解問題的最好方法是嘗試向其他人解釋它:))