私はpostfixと組み合わせてメールをフィルタリングするためにprocmailを使用しています。 procmailは、main.cf mailbox_commandを介してpostfixによってトリガーされます。
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}
正確にはわかりませんが、2つは同じコマンドではないようです。この状況が、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で機能しますが、ユーザーをオフにします。procmailrcDROPPRIVS= yes強制されたprocmailは、ユーザーwitchとして機能するため、-dなしで機能し、/ var/mail /に配信されます。ポイントわからない。
dROPPRIVSをオンにすると、ユーザーのホームフォルダに.prcocmailrcがある場合にのみ機能するようです。これは、/ home /に配信するように定義できるためです。そうでない場合、メールは/ var/mail /に配信され、maildir形式ではなくmbox形式で配信されます。
回避策は、/ 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にないため、deliverのコードのどこかにあるようです。
とにかく、この行の後、ユーザー.procmailrcに正しくジャンプし、失敗することなく実行します。したがって、この失敗は単なる表面的なもののようです。
P.S.問題を理解する最良の方法は、他の誰かにそれを説明しようとすることです:))