Procmailの使い方

プログラムの説明

procmailはmail配送に関するフィルタープログラムです。設定した条件にしたがって特定の
メールをフォワードしたり、指定したディレクトリに保存する等といった処理が可能となります。

詳細な情報(リンク)

Procmailのホームページ(英語版)

Procmailのマニュアル(日本語版)

注意 

このプログラムはメールの配信方法を変更します。 したがって間違った設定をするとメールが届かなかったり
最悪の場合は消えてしまうこともあります。導入の際には細心の注意を払って行うかもしくは近くの経験者にたずねる
などして大事なメールをなくさないようにしてください。
もしもうまく機能しない、メールが配信されないなどの症状が現れた場合には以下に説明している .forwardファイルを
削除していったんprocmailの使用を終了させてください。

設定の方法

設定すべきファイルは2つです。
1つ目は .forward ファイル(sendmail用のメール転送設定ファイル)と2つ目が .procmailrc ファイル
(procmailが使用する設定ファイル)です。
.foward ファイルは導入時に一度設定すれば良いでしょう。 .procmailrcファイルは判定条件を記述
するファイルですのである程度の頻度で書き換えたり条件を追加したりする必要があると思います。
以下にそれぞれのファイルの設定方法について説明します。

.forward ファイルの設定

最初に、これまで使用していた .forward ファイルのコピーを作成しておきます(使用していなかった人は
必要ありません)。
コピーの例
> cp .forward .forward.org

エディターで .forward ファイルを開きます。開いた .forwardファイルに次の一行を書き込みます。
"|IFS=' ' && exec /usr/local/bin/procmail -f- || exit 75 #username"
必ず最初と最後をダブルクォーテーションでくくってください。 また最後の部分のusernameは
各自のユーザ名で置き換えてください。
編集が終わったらファイルを保存して各自のホームディレクトリに置いてください。
これでメールはprocmailによって処理されることとなります。

.procmailrcファイルの設定

.procmailrcファイルに基本的な設定、配送の条件などを記述していきます。
最も基本的なMH形式を用いてメールを利用しているユーザーの設定ファイルは以下のようになります。
この例ではメールのFrom行にml-rcnpというキーワードがあるものは$HOME/inbox/ml-rcnpというディレクトリに
MH形式で保存され、From行にml-kakuri1というキーワードがある場合にはaaa@keitai.ne.jpというメールアドレスに
転送されます。
なお # で始まる行はコメント行です。procmailは処理を行いません。
# .procmailrcの設定例1
#  Log ファイルの指定
LOGFILE=$HOME/procmail.log
# メイルを保存するディレクトリの指定
MAILDIR=$HOME/Mail
# Lockファイルの指定
LOCKFILE=$HOME/.lockmail
# 以下条件の記述
# 特定のディレクトリに保存する場合
:0
*^From: .*ml-rcnp.*
 $MAILDIR/ml-rcnp/.
# メールを他のアドレスへ転送する場合
:0 c
*^From: .*ml-kakuri1.*
 ! aaa@keitai.ne.jp

この設定例では上から順にいくつかの変数を定義しています。LOGFILEはprocmailが処理したメールの履歴を
記録します。 MAILDIRはメールを保存するディレクトリのルートです。LOCKFILEは排他制御を実現するための
ファイルです。最低この3つの変数を設定しておけば機能します。
変数の設定の次に配送条件を記述します。
:0 から始まるのが条件記述部分になります。3行で一つの条件を記述します。列挙することで複数の条件を
設定することが可能です。
procmailは条件を上から検査して合致したところで処理は終わります。それ以降の判断は行いません。
すべての条件に合致しなかった場合は/var/spool/mail/username に保存されますので、従来の方法で
saho/senri上にてメールを取り込むことができます。
:0 が記述開始をあらわします。*で始まる行が実際の条件を記述している部分です。正規表現を用いて記述します。
3行目が配送先を指定しています。ディレクトリ、メールアドレスどちらでも可能です(さらにプログラムに渡すことも可能です)。
上の例で言うと一番目の条件がFrom行にml-rcnpというキーワードが存在する場合には$MAILDIR/ml-rcnp/. に保存する。
このとき最後の /. は省略しないでください。 2番目の条件はFrom行にml-kakuri1というキーワードがある場合には
aaa@keitai.ne.jp にメールを転送するという設定になります。メールの転送を表すために行頭に ! マークを必ずつけてください。
また :0 c という条件先頭行は転送するだけでなくデフォルトの保存先にもコピーを保存することを指定しています。
特別優先順位の高いものを自宅もしくは携帯のメールへ転送しつつ、saho/senri上のメールとしても保存できる訳です。
編集が終わり保存したら、.procmailrcファイルの読み書き権限を変更しておきます。
実際に配送先のアドレスなど個人的な情報を書くことになるので、マナーとして自分以外は読み書きできないようにしましょう。
> chmod 0600 .procmailrc


次の例は基本的には上記と同じですが、デフォルトのメール保存場所を明示的に指定する設定です。
# .procmailrcの設定例2
#  Log ファイルの指定
LOGFILE=$HOME/procmail.log
# メイルを保存するディレクトリの指定
MAILDIR=$HOME/Mail
# デフォルトのメール保存先の指定
DEFAULT=$MAILDIR/inbox/.
# Lockファイルの指定
LOCKFILE=$HOME/.lockmail
# 以下条件の記述
# 特定のディレクトリに保存する場合
:0
*^From: .*ml-rcnp.*
 $MAILDIR/ml-rcnp/.
# メールを他のアドレスへ転送する場合
:0 c
*^From: .*ml-kakuri1.*
 ! aaa@keitai.ne.jp
変数記述の部分にDEFAULT変数を設定しています。これによってデフォルトのメール保存先を変更することが
できます。

ジャンクメールを自動的に消去する設定は以下のとおりです。
ここではジャンクメールはSubject行にJUNKというキーワードを有すると仮定します。
# .procmailrcの設定例3
#  Log ファイルの指定
LOGFILE=$HOME/procmail.log
# メイルを保存するディレクトリの指定
MAILDIR=$HOME/Mail
# Lockファイルの指定
LOCKFILE=$HOME/.lockmail
# 以下条件の記述
# 特定のメールを消去
:0
*^Subject: .*JUNK.*
 /dev/null

これでSubjectにJUNKというキーワードが存在するメールは自動的に消去されます。
ただし、これでは万が一の場合に復旧できないのでジャンクメール用のフォルダを別途作成しておいて
そこに保存するようにしておく方が安全でしょう。

Unix mail形式を使用しているユーザの設定例は以下のとおりです。
From行にml-rcnpというキーワードがあるばあいには$HOME/ml-rcnpというファイルにUnix mail形式で
保存され、From行にml-kakuri1というキーワードがある場合にはaaa@keitai.ne.jpに転送されます。
条件に合致しなかった場合には$HOME/mboxへと保存されます。
# .procmailrcの設定例4
#  Log ファイルの指定
LOGFILE=$HOME/procmail.log
# メイルを保存するディレクトリの指定
MAILDIR=$HOME
# デフォルトのメール保存先の指定
DEFAULT=$MAILDIR/mbox
# Lockファイルの指定
LOCKFILE=$HOME/.lockmail
# 以下条件の記述
# 特定のファイルに保存する場合
:0
*^From: .*ml-rcnp.*
$MAILDIR/ml-rcnp
# メールを他のアドレスへ転送する場合
:0 c
*^From: .*ml-kakuri1.*
 ! aaa@keitai.ne.jp
MH形式からの変更点を赤色で示しています。
Unix Main形式ではmailは基本的に一つのファイルに追加されていきます。
したがってMH形式の場合のように最後に/. をつける必要はありません。

実用上のTips

procmailの制御について

実際にprocmailを使用している場合に何らかの理由でこの設定を解除する必要があるかもしれません。
そのようなスイッチOn/Offの制御は.forwardファイルを置き換えによって実現できます。
.forward ファイルの設定のところで書いたようにprocmailを使わない場合の.forwardファイルを.forward.org
という名前で保存していたとすると、procmailを使用しないで以前の状況に復旧する方法は以下のとおりです。
> cp .forward  .forward.proc
> cp .forward.org  .forward
これでprocmailは起動されなくなります。
ただし2回目以降は以下のコマンドだけで十分です。
> cp .forward.org .forward

通常、フォワード機能を利用していなかった人は
> mv .forward .forward.proc
としてやればprocmailのサービスは行われません。
再びprocmailのサービスを利用したいときには逆の操作を行ってやります。
> cp .forward.proc .forward

条件記述について

条件記述は上であげた例のようにメールのあるフィールドにキーワードが存在するか否かで判定する場合が
一般的であると思います。
比較的頻繁に利用すると思われる場合の記述例をまとめて以下に挙げておきます。

From行でのパターンマッチングの例。 From行にml-kakuri1というキーワードが存在する場合に条件一致。
:0
*^From: .*ml-kakuri1.*
 ! aaa@keitai.ne.jp

Subject行でのパターンマッチングの例。 Subject行にJUNKというキーワードが存在する場合に条件一致。
:0
*^Subject: .*JUNK.*
 ! aaa@keitai.ne.jp

特殊なヘッダーに対してのパターンマッチングの例。 X-test-header: というヘッダー行に対するパターンマッチングの例です。
将来的にはスパムメール対策ソフトなどでつけられた特殊なヘッダーを解釈して選択的にメールを受け取るような場合に有効です。
0
*^X-test-header: .*JUNK.*
 /dev/null
この例はX-test-header行にJUNKというキーワードが存在する場合には自動的に消去するという設定です。

procmail自体はヘッダー内を検索し文字列が一致するかどうかを判断するだけですので例えば
:0
*.*test
 ! aaa@keitai.ne.jp
という記述が.procmailrc内にあればメールヘッダー内の任意の位置にtestという文字列が存在すれば
aaa@keitai.ne.jpに転送されることになります。

各自の設定で上記以外の有効な活用方法もあると思います。
いろいろと試してみてください。

              文責  内田 誠