Procmail(Postfix + Virtual Host/Domain)で迷惑メールをフィルタする

PostfixとProcmailを連携させて、迷惑メールをフィルタリングする。Postfixでは、header_checks, body_checksを使って簡単なフィルタリングはできるが、Base64エンコードされたメールに対応できない。

1. Procmailのインストール

# yum install procmail

 

2. レシピ(フィルタ)の設定

拒否ワードが本文に含まれるメールを削除する。まずは、拒否ワードリストの作成。

# mkdir /etc/procmail
# vim /etc/procmail/spamwords

上記ファイルにスパムワードを1行に1つずつ記載。スパムワードは、本文中に記載されているドメイン名がよい。迷惑サイトに誘導するために有害なドメインを記載している可能性が高い。

続いて、/etc/procmailrcを作成し、レシピを記載する。

SHELL=/bin/bash
PATH=/usr/bin:/bin
MAILDIR=/var/spool/mail/vhosts/$DOMAIN/$USER/Maildir
# Maildir形式で運用している場合、最後のスラッシュが必須
DEFAULT=$MAILDIR/
LOGFILE=$MAILDIR/procmail.log

SPAMWORDS=/etc/procmail/spamwords

# Base64エンコードされたメール
:0 B
*? test -s $SPAMWORDS
*? nkf -wmB | fgrep -iqf $SPAMWORDS
#$MAILDIR/trash/. → 削除でなくゴミ箱に移動する場合は下行ではなくこちら
/dev/null

# Base64エンコードされていないメール
:0 B
*? test -s $SPAMWORDS
*? nkf -w | fgrep -iqf $SPAMWORDS
#$MAILDIR/trash/.
/dev/null

3. Postfixの設定変更

postfixからprocmailに処理を渡すために、/etc/postfix/main.cfの最後に以下を追加。

# virtualhostを利用している場合、mailbox_commandは呼び出されないので注意。

local_transport = virtual
virtual_transport = procmail

続いて/etc/postfix/main.cfの最後に以下を追加。

procmail  unix  -       n       n       -       -       pipe
  flags=R user=vmailuser argv=/usr/bin/procmail -t -m USER=${user} DOMAIN=${nexthop} /etc/procmailrc

vmailuserはpostfixのvirtual hostで利用しているユーザを指定する。ユーザをmain.cfで下記のようにuidで指定している場合、実際のユーザとグループを作成する必要がある。

virtual_uid_maps = static:5000

ユーザとグループの作成。

# groupadd -g 5000 vmailuser
# useradd -u 5000 -g vmailuser -s /sbin/nologin vmailuser

postfixを再起動して設定完了。

# service postfix restart

 

■参考