Procmailを使用したメールフィルタリング ~第1回~

この記事は2015年11月14日に書かれたものです。内容が古い可能性がありますのでご注意ください。


<h1>procmail について</h1>

<strong>
procmail はLinuxなどで使用されているメールのフィルタリングをするソフトです。

メールサーバ上に届いたメールをLinux上のユーザのメールスプールやメールボックスなどに
振り分ける際にフィルタリングをすることができます。

フィルタリングすることで、特定のメールを特定のメールアドレスに転送したり、
特定のメールを指定したファイルに保存したりすることができるようになります。
</strong>
<h2>procmailのインストール</h2>

最近のCentOSなどのバージョンでは、あらかじめインストールされていることもありますが、
procmailは下記のコマンドでインストールすることができます。

[root@localhost ~]# yum install procamil

<h2>procmailを使用するための設定</h2>

procmailを使用するように postfix などのMTAで設定を行います。
以下のようにして procmail がインストールされている場所を指定します。

[root@localhost ~]vi /etc/postfix/main.cf
#mailbox_command = /some/where/procmail
#mailbox_command = /some/where/procmail -a "$EXTENSION"
mailbox_command = /usr/bin/procmail

procmailの実行ファイルがどこに保存されているかは以下のコマンドで確認できます。

[root@localhost ~]# which procmail
/usr/bin/procmail

<h3>postfixの再起動</h3>

procmailを使用するための設定を追加したので、postfixを再起動します。

[root@localhost ~]# /etc/init.d/postfix restart

<h2>procmailのフィルターの設定</h2>

テスト用にuser01を追加して確認してみます。
ちなみにユーザに届いたメールはメールスプール (/var/mail/ユーザ名 )に保存されるようになっています。

[root@localhost ~]# useradd user01
[root@localhost ~]# su - user01

追加した user01ユーザにチェンジして、
/home/user01 (ホームディレクトリ) に下記のようにして .forward ファイルを作成します。
.forward ファイルは通常はユーザのメールを転送する際などに使用しますが、
ここに procmail を使用するための設定を記述する必要があります。

下記の #user01 の部分はユーザ名に合わせておきます。

[user01@localhost ~]$ vi .forward
"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #user01"

新しく以下の .procmailrc ファイルをホームディレクトリに作成して、
そこに転送やフィルタリングを行うための設定を記述します。

[user01@localhost ~]$ vi .procmailrc
LOGFILE=$HOME/procmail.log
:0
* ^From:.*root
! user02@localhost

今回は From に root という文字が含まれていたら user02@localhost に転送をするというルールを記述しています。

また転送した際のログは、user01のホームディレクトリの
procmail.log というファイルに記録するようにしています。
procmail のフィルタリングの設定はレシピと呼ばれ、
基本的には 0: を基準に3行ごとに記述します。

上記の例で言うと
3行目の :0 がルールの始まりで、
4行目の * ^From:.*root というのが処理条件
5行目の ! user02@locahost というのが処理条件にマッチしたメールに対してのアクションになっています。
複数のルールを記述したい場合は、下記のように記述することができます。

.procmailrc

:0
処理条件
アクション
:0
処理条件
アクション
:0
処理条件
アクション

処理条件には以下の様な正規表現を指定することができるようになっています。
<ul>
<li>^ : 行の先頭を示す</li>
例えば ^From などと書くとメールヘッダの From で始まる行が存在したらという意味になる
<li>$ : 行の末尾を示す</li>
例えば AAA$ などと書くと AAA という文字で終わる行が存在したらという意味なる
<li>. : 任意の一文字</li>
<li>* : 任意の文字</li>
例えば .*AAA.* などと書くと AAA という文字が含まれる行が存在したらという意味なる
また例えばすべてのメールを指定する場合は条件に * とだけ入れれば良い
<li>! : 条件の否定を示す</li>
<li>< : メールの長さのバイト数の指定などで、指定した数値以下などを指定するときに使用する</li>
<li>> : メールの長さのバイト数の指定などで、指定した数値以上などを指定するときに使用する</li>
</ul>
またアクションには以下の様な記述をすることができるようになっています。
<ul>
<li>! <メールアドレス>: 転送先のメールアドレスを記述する場合に使用する</li>
<li>| <コマンド> : パイプに続けて、実行したいシェルコマンドを指定することができる</li>
<li>ファイル名: 記述したファイルにメールを保存する</li>
<li>/dev/null : メッセージを破棄する</li>
</ul>
またその他にレシピを記述する際に以下の様な変数を使用することもできるようになっています。
<ul>
<li>LOGFILE : procmailで処理した記録を保存するファイルを指定する</li>
<li>MAILDIR : メールボックス形式を使用している場合に、メールの格納場所を指定する際に使用する</li>
<li>DEFAULT : 条件に該当しなかったメールの保存場所などを指定することができる</li>
</ul>

これ以外にいろんな変数などが存在しています。
今回はここまで次回はフィルタリングの設定をして、
動作を確認してみます。

 

  • このエントリーをはてなブックマークに追加

PAGE TOP