2006年9月22日金曜日

メール環境改革 - procmail

procmail はメールフィルタとして働きます。
受信メールを fetchmail や qmail から直接 procmail に渡すことで振り分け等ができます。
まずは以下でインストールします。

# echo 'mail-filter/procmail ~x86' >> /etc/portage/package.keywords
# emerge mail-filter/procmail

これからは各ユーザの作業となります。
各ユーザのホームディレクトリに procmail 用の設定ファイルを作ります。
設定ファイルの名前はデフォルトでは .procmailrc ですが、
procmail を呼び出すときに引数で指定できるので任意でかまいません。
とりあえず以下を実行します。

$ cd ~
$ touch .procmailrc

procmail 設定ファイルの内容については後述するとして、
各プログラムとの連携方法について説明しておきます。

まず、qmail です。
qmail は各ユーザの ~/.qmail でメールの配信先が設定可能です。
また、ユーザ名<user> の ~/.qmail-<string> で <user>-<string> 宛てに届いたメールの扱いを設定可能です。
(メーリングリストやセカンドメールアドレスとして利用できます。)
内容的には、'#' で始まる行はコメント、
'.' や '/' で始まる行は保存先ファイル(mailbox形式)か(最後に'/'がつけば)ディレクトリ(maildir形式)
'&' で始まる行は転送先メールアドレスになります。
ここで、'|' で始まる行には外部コマンドがかけます。
すなわち、

$ echo '| /usr/bin/procmail' >> ~/.qmail

で、qmail が受信したそのユーザ宛のメールが procmail に渡され、
~/.procmailrc の設定に従って処理されます。

次に fetchmail との連携です。
fetchmail は各ユーザの ~/.fetchmailrc で設定可能です。
前回その内容について、1アカウント毎に

poll <IP address or FQDN of mail server A>
user <user name of mail server A>
password <user password of mail server A>
is <unix account in this server for storing received mail> here

のようにすればよいと書きましたが、is コマンドの替わりに mda コマンドを利用します。
以下のようにします。

poll <IP address or FQDN of mail server A>
user <user name of mail server A>
password <user password of mail server A>
mda "/usr/bin/procmail .procmailrc.server_a"

そして ~/.procmailrc.server_a に procmail の処理設定を記述します。
こうしておけば、周期実行等で fetchmail が起動された際に、
メールサーバ A にメールを取りにいき、
取ってきたメールは procmail 渡され、
~/.procmailrc.server_a の設定に従って処理されます。

連携の仕方については以上です。
次は procmail の設定ファイルの内容についてです。
詳細については

$ man procmailrc

で表示されますのでそちらを参照ください。
設定ファイルは環境変数の設定と制御内容で構成されます。
意味のある最小限の構成は以下のようなものと思います。

LOGFILE=$HOME/procmail.log

:0 c
* ! ^X-Loop: ttanimu@aaaa.jp
! ttanimu@bbbb.jp

先頭の "LOGFILE=$HOME/procmail.log" は動作ログを ~/procmail.log に書き込めということですが、
動作状況を確認するためにも、これは書いておいた方がいいでしょう。
その他の環境変数はデフォルトでもかまわないと考えています。
動作不良があった時点で追加すればいいのではないでしょうか。
環境によっては MAILDIR をきちんと設定しておかないと、受信メールのローカル保存が失敗するかもしれません。

その次が制御内容でレシピと呼ばれています。
レシピは複数記述でき、先頭から順にレシピの条件に当てはまるかどうかを調査し、
成立すればそのレシピを実行、その後のレシピは無視されるようです。
1つのレシピは先頭が ":0" の行から始まり、次の ":0" で始まる行の手前までとなります。

":0" の次の 'c' は fetchmail で取得したメールをローカルにも残すことを意味します。
'*' で始まる行は条件の指定で、一般的な正規表現を使ってあらわせます。
詳細は man procmailrc で確認ください。
この条件は、「 "X-Loop: ttanimu@aaaa.jp" で始まる行がヘッダになければ以下を実行」となります。
条件が成立したときに実行されるのが次の行で、
'!' は転送先のメールアドレスを ' ' で区切って複数個指定できます。
前述の場合、ttanimu@bbbb.jp へ転送ということになります。

一通り説明しましたが、
複数のメールアドレスを持っている場合、
qmail, fetchmail, procmail を組み合わせるとかなり高度な応用ができます。
ただし注意しなければならないのは、メールの転送がループにならないようにすることです。
さらに、必要なメールが消失しないようにすることです。
メーリングリスト宛てのメールのヘッダには自分のメールアドレスが一切かかれていないことがあるので、
フィルタ時に消失しないよう特に注意が必要です。

これでメールサーバに関するほとんどの設定が終わりました。
また何かあれば追記したいとは思っていますが、
いつになるかはわかりませんので、あまり期待はしないでください。
それではまたいつか。

0 件のコメント:

コメントを投稿