11.4. Mail Delivery Agents

Red Hat Enterprise Linux には2種類の主要 MDA (Procmail とmail)が含まれています。これらのアプリケーションは両方とも、LDA(Local Delivery Agent) と考えられ、 その両方が電子メールを MTA のスプールファイルからユーザーのメールボックス へ転送します。しかし、Procmail は強健なフィルターシステムを提供します。

このセクションは、Procmailのみについて詳細を説明します。mailコマンドに 付いての情報は、そのmanページを御覧下さい。

Procmailを使用すると、ローカルホストのメールスプールファイルにある電子メールの フィルターと配送をします。Procmailは強力で、システムリソースにやさしく、広範囲で 使用されています。これは、電子メールクライアントアプリケーションで読み込まれる 予定の電子メールを配送する時点で重要な役割りを果たします。

Procmailは幾つかの方法で喚起されます。MTA が電子メールをメールスプールファイルに配置すると Procmailが起動します。その後 Procmail は MUAの為に電子メールをフィルタしファイルして終了します。別の方法では、メッセージが受信された時にProcmailを実行するように MUA を設定してメッセージが正しいメールボックスに移動されるようにします。デフォルトでは、/etc/procmailrc、又はユーザーのホームディレクトリ内の.procmailrcファイル(あるいは rcファイルとも呼ばれる)の 存在は、MTA が新しいメッセージを受信する度に Procmail を喚起します。

Procmailが電子メールでとるアクションは、メッセージがrc ファイルの中の特定の条件、又はレシピに適合するかにより 左右されます。メッセージがレシピに一致すると、電子メールは特定のファイル内に 設定されるか、削除されるか、またはそれ以外の方法で処理されます。

Procmailが起動すると、電子メールメッセージを読み取り、ヘッダー情報から本体を分離します。次に、Procmail はデフォルトのシステム全体の Procmail 環境変数とレシピ用の/etc/procmailrcsディレクトリ内の/etc/procmailrcファイルとrcファイルを探します。次に、Procmailはユーザーのホームディレクトリ内の. procmailrcファイルを探します。多くのユーザーは、自己のホーム ディレクトリ内の.procmailrcで参照される Procmail用の追加rcファイルも作成します。

デフォルトでは、システム全体のrcファイルが/etcディレクトリに存在せず、 ユーザーのホームディレクトリ内の .procmailrcファイルも存在しません。その為Procmailの使用を 開始するには、特定の環境変数と、 特定の規則をもって、 .procmailrcファイルを作成する必要があります。

11.4.1. Procmailの設定

Procmail 設定ファイルには、重要な環境変数が含まれています。これらの変数は、 どのメッセージをソートするか、レシピに一致しないメッセージをどう処理するかなどを指定します。

これらの環境変数は通常、.procmailrcの先頭に表示されます。 以下のような形式になります:

<env-variable>="<value>"

この例では、 <env-variable>は変数の名前であり、 <value>は、変数を定義します。

環境変数の多くはほとんどのProcmailユーザーに使用されず、それより重要な環境変数の多くはすでにデフォルト値が定義されています。ほとんどの場合、次のような変数が使用されます:

他の重要な環境変数は、ログイン名であるLOGNAME、ホームディレクトリのロケーションであるHOME、デフォルトシェルであるSHELLなどのシェルから抜き出されます。

すべての環境変数とそれらのデフォルト値に関する総合的な説明は、procmailrc の man ページで御覧下さい。

11.4.2. Procmailレシピ

新規ユーザーには、多くの場合、レシピの作成がProcmailを使用するための最も困難な学習領域と思われるかも知れません。ある程度理解できるものです。それは、レシピが照合用文字列に修飾を指定するための特別なフォーマットである正規表現を使用してメッセージの照合を行うからです。ただし、 正規表現はそれほど設定しにくかったり、読み取るときに理解しにくかったりするものではありません。 また、Procmailレシピを書く方法の一貫性は、正規表現とは無関係に、何が行われているかを例で容易に見ることが出来ます。Procmailレシピの例を見るには 項11.4.2.5を参照して下さい。

Procmailレシピは、次の形式をとります:

:0<flags>: <lockfile-name>

* <special-condition-character> <condition-1>
* <special-condition-character> <condition-2>
* <special-condition-character> <condition-N>

<special-action-character><action-to-perform>

Procmailレシピの最初の2文字はコロン(:)と0です。このレシピを処理するときに Procmailが何をするかを制御するには、 0の後に各種フラグを設定できます。<flags> セクションの後のコロンは、このメッセージのためのロックファイルを作成することを指定します。ロックファイルを作成する場合は、<lockfile-name>の中でその名前を指定します。

レシピには、メッセージと照合するいくつかの条件を含めることができます。条件がない場合、すべてのメッセージはレシピに一致します。正規表現にはメッセージとの照合を実施するために、いくつかの条件が設定されます。複数の条件を使用する場合、アクションを実行するためにこれらの条件がすべて一致しなければなりません。条件は、レシピの最初の行で設定されたフラグに基づいてチェックされます。*文字の後に設定されたオプションの特別な文字は、さらに条件を制御できます。

<action-to-perform>は、条件のうちの1つにメッセージが一致する場合に取る行動を指定します。レシピごとにアクションは1つしか指定できません。多くの場合、ここではメールボックスの名前を使用して一致するメッセージをそのファイルに送り、電子メールを効率的にソート します。アクションを指定する前にも、特別なアクション文字を使用できます。 詳細情報は項11.4.2.4を参照して 下さい。

11.4.2.1. 配信レシピと非配信

レシピが特定メッセージに一致する場合に使用されるアクションは、レシピが配信非配信のいずれかであるかを決定します。「配信レシピ」には、ファイルにメッセージを書き込んだり、別のプログラムにメッセージを送ったり、別の電子メールアドレスにメッセージを転送したりするアクションが含まれています。「非配信レシピ」は、ネスト用ブロックなどの他のアクションをカバーします。ネスト用ブロックとは、レシピの条件に一致するメッセージで実行する括弧{} に囲まれたアクションのセットです。ネスト用ブロックをさらにネストして、メッセージ上のアクションを識別して実行するためのさらに大きな制御を与えることができます。

メッセージが配信レシピと一致する場合、Procmail はその特定アクションを実行し、 他のレシピとメッセージの比較を停止します。非配信レシピと一致するメッセージは 他のレシピに対して比較が続けられます。

11.4.2.2. フラグ

フラグは、いかにレシピの条件をメッセージと比較するか、あるいはレシピの条件をメッセージと比較するかどうかを決定する際に非常に重要です。次のフラグが 一般に使用されます:

  • A — このレシピがAフラグやaフラグのない以前のレシピもこのメッセージに一致した場合のみ使用されることを指定します。

  • a — このレシピがAフラグや aフラグのある以前のレシピもこのメッセージに一致しさらに正常に完了した場合のみ使用されることを指定します。

  • B — メッセージの本文を構文解析し、一致する条件を探します。

  • b — メッセージをファイルに書き込んだり転送したりするなどの結果的なアクションで本文を使用します。これはデフォルトの動作です。

  • c — 電子メールのカーボンコピーを作成します。これが配信レシピで便利なのは、必要なアクションをメッセージ上で実行でき、メッセージのコピーをrc ファイルで処理し続けることができるからです。

  • Degrepの比較を大文字と小文字を区別するものにします。デフォルトでは、比較プロセスは大文字と小文字を区別しません。

  • EAフラグと似ていますが、 Eフラグのない直前のレシピが一致しなかった場合に このレシピ内の条件がメッセージと比較されます。これは、 elseアクションに匹敵します。

  • e — 直前のレシピに指定されたアクションが失敗した時のみ、 レシピはメッセージと比較されます。

  • f — パイプをフィルタとして使用します。

  • H — メッセージのヘッダーを構文解析し、一致する条件を探します。これは、デフォルトで行われます。

  • h — 結果のアクションでヘッダーを使用します。これは デフォルトの動作です。

  • w — 指定されたフィルタか、プログラムが終了するまで待機し、 フィルタ処理されたメッセージを考慮する前にそのフィルタか、プログラムが 成功したかどうかを報告するようにProcmailに指示します。

  • W — "Program failure"メッセージが抑制されていること 以外は wと同一です。

追加フラグの詳細一覧は、procmailrcmanページを 参照して下さい。

11.4.2.3. ローカルロックファイルの指定

ロックファイルは、Procmailで複数のプロセスが同時に一定のメッセージを変更することを止めるのに非常に便利です。レシピの最初の行のフラグの後にコロン(:)を設定することによって、ローカルロックファイルを指定できます。このため、宛先のファイル名とLOCKEXT グローバル環境変数で設定されたすべてのものに基づいて、ローカルロックファイルが作成されます。

別の方法として、コロンの後にこのレシピで使用するローカルロックファイルの名前を指定します。

11.4.2.4. 特別な条件とアクション

Procmail レシピの条件とアクションの前に使用される特別な文字は、それら条件とアクションを解釈する方法を変更します。

レシピの条件行の先頭にある*文字の後に、次の文字を使用できます。

  • ! — 条件の行でこの文字は条件を反転するため、条件がメッセージと一致しない場合のみ照合が行われます。

  • < — メッセージが指定のバイト数より少ないかどうかを確認します。

  • > — メッセージが指定数のバイトより多いかどうかを確認します。

特別なアクションを実行するには、次の文字を使用します。

  • ! — アクションの行では、この文字が指定された 電子メールアドレスにメッセージを転送するように Procmail に指示します。

  • $rcファイル内で以前に設定された 変数を参照します。これは通常、各種レシピで参照される共用メールボックスを設定する場合に使用します。

  • | — メッセージをプロセスする為に特定のプログラムを 起動します。

  • { and } — 追加レシピを組み込んで 照合用メッセージに適用するためのネスト用ブロックを作成します。

アクション行で特別な文字を使用しない場合、Procmailはメッセージを書く為のメールボックスをそのアクション行が指定していると判定します。

11.4.2.5. レシピの例

Procmailは非常に柔軟性のあるプログラムで、 この柔軟性の結果、初めから Procmailレシピを作成することは、新規ユーザーにとって困難である可能性が あります。

Procmail レシピの条件を設定する技能を開発する最善の手段は、他の人が組み立てた多くの例を参考にすることと共に、正規表現の十分な理解から始まります。正規表現についての完全な説明は、このセクションの担当範囲を越えています。 Procmailレシピの構成と、役立つサンプルの Procmail レシピがインターネットのさまざまなサイトで参照できます。(例えば:http://www.iki.fi/era/procmail/links.html ) 正規表現の正しい使用とその応用はこれらのレシピサンプルを参照することで理解できます。基本的な正規表現規則の入門情報は、grepの manページで参照することが 出来ます。

次の簡単なサンプルが Procmail レシピの基本的な組み立てを示し、そしてより複雑な構成の基盤を提供します。

基本的なレシピには、次の例で示すように条件が付いていないものさえあります:

:0:
new-mail.spool

第1行では、ローカルロックファイルを作成しても名前を指定しないように指示して Procmail が宛先のファイル名を使用して、LOCKEXT環境変数にある 値を付けます。条件は指定されないので、すべてのメッセージがこのレシピに一致して、 MAILDIR環境変数で指定されたディレクトリ内にある new-mail.spoolと呼ぶ単一のスプールファイルに設定されます。この場合、 MUA はこのファイル内のメッセージを見ることができます。

このような基本的なレシピは、全てのrcファイルの末尾に配置して、 メッセージをデフォルトの場所に転送します。

次のサンプルは特定の電子メールアドレスからのメッセージと一致しており、それを廃棄します。

:0
* ^From: spammer@domain.com
/dev/null

この例では、spammer@domain.comから送られたメッセージはすべて、ただちに/dev/nullデバイスに移動され削除されます。

注意重要
 

メッセージを永久削除の為に /dev/nullに移動する前に 規則が正しく機能していることに注意してください。レシピ条件で不注意に意図していない メッセージを取り込んで、そのメッセージが跡形もなく消滅した場合、規則を トラブルシュートすることが困難になります。

改善案としてはレシピのアクションを特定のメールボックスにポイントして、それが、定期的に false positives を探すようにします。すなわち偶然に条件と一致したメッセージを探すためにチェックするようにします。偶然に一致したメッセージがないと確認できた後は、メールボックスを削除してアクションに対しメッセージを/dev/nullに送るように指示します。

次のレシピは特定のメーリングリストから配送された電子メールを取り込み、 それを指定されたフォルダーに配置します。

:0:
* ^(From|CC|To).*tux-lug
tuxlug

tux-lug@domain.comメーリングリストから送られたメッセージはすべて、MUAのためにtuxlugメールボックスに自動的に配置されます。メールのFrom行、CC行、 To行のどれかにメーリングリストの電子メールアドレスがあれば、 この例の条件はメッセージに一致することに注意してください。

より詳細で強力なレシピを調べるには 項11.6で確認できる、多数のProcmailオンライン リソースを参照して下さい。

11.4.2.6. スパムフィルタ

新しい電子メールの受信時に Sendmail、Postfix、Fetchmailによってコールされますので、 Procmailはスパムと戦う強力なツールとして使用されます。

これは特に Procmail が SpamAssassin と併用される時に明確になります。一緒に使用するとこれらの2つのアプリケーションは素早くスパムを認識して、分類するか又は破壊します。

SpamAssassin はヘッダ解析、テキスト解析、ブラックリスト、スパム追跡データベース、及び学習機能のある Bayesian スパム解析を使用し、スパムを正確に素早く識別してタグを付けます。

ローカルユーザーにとって最も簡単な SpamAssassinの使用法は、以下の行を ~/.procmailrc fileの先頭近くに置くことです:

INCLUDERC=/etc/mail/spamassassin/spamassassin-default.rc

/etc/mail/spamassassin/spamassassin-default.rc には、入信の電子メールすべての為に SpamAssassin を起動する簡単な Procmail 規則が含まれています。電子メールがスパムだと判定された場合、そのようにヘッダにタグが付けられ、タイトルは次のパターンでその前に付けられます:

*****SPAM*****

電子メールのメッセージ本文もまた、何が原因してスパムと診断されたのかという 流動符号が前付けされます。

スパムとしてタグの付く電子メールをファイルするには、次の規則と良く似たものが使用されます:

:0 Hw
* ^X-Spam-Status: Yes
spam

この規則はヘッダ内でスパムとタグの付いた電子メールの全てを spam と呼ばれるメールボックスにファイルします。

SpamAssassin は Perlスクリプトなので、負荷の大きいサーバー上ではバイナリ SpamAssassin デーモン(spamd)および クライアントアプリケーション(spamc)を使用する必要があるかも知れません。このような SpamAssassin の設定にはルートでホストにアクセスしなければいけません。

spamdデーモンをスタートするには、ルートで 以下のように入力します:

/sbin/service spamassassin start

システムが起動するときに SpamAssassin デーモンをスタートさせるには、 サービス設定ツール (redhat-config-services)などの initscript ユーティリティを使用してspamassassinサービスを始動します。 initscript ユーティリティに関する詳細情報は項1.4.2を参照して下さい。

Perlスクリプトの代わりに、Procmail を設定して SpamAssassinクライアント アプリケーションを使用する場合、以下の行を~/.procmailrcファイルの上部に配置します。システム全体の設定には、その行を/etc/procmailrcの中に入れます:

INCLUDERC=/etc/mail/spamassassin/spamassassin-spamc.rc