11.4. Mail Delivery Agents

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

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

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

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

Procmailが電子メールでとるアクションは、メッセージがプログラムで照合されるという特定のレシピ、すなわち規則、からの指示により異なります。メッセージがレシピに一致すると、電子メールはある種のファイル内に設定されるか、削除されるか、またはそれ以外の方法で処理されます。

Procmailが起動すると、電子メールメッセージを読み取り、ヘッダー情報から本体を分離します。次に、 Procmailはデフォルトのシステム全体のProcmail環境変数とレシピ用の/etc/procmailrcs ディレクトリ内の/etc/procmailrcファイルとrcファイルを探します。 次に、Procmailはユーザーのホームディレクトリ内の.procmailrcファイルを探し、そのユーザーに 固有の規則を見つけます。多くのユーザーは、.procmailrcで参照されるProcmail用の独自の 追加rcファイルも作成します。ただし、これらのファイルはメールフィルタ処理の問題が 発生した場合にただちにオン/オフすることができます。

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

ほとんどの設定では、Procmailが起動して電子メールのフィルタ処理を試行するかどうかの決定は、 ユーザーの.procmailrcファイルの有無に基づきます。Procmailを無効にして、 .procmailrcファイルに作業内容は保存したい場合、mv ~/.procmailrc ~/.procmailrcSAVEなどのコマンドで類似するファイルの名前にそのファイルを移動します。 Procmailのテストを再開できる状態のときは、ファイル名を.procmailrcに戻します。 ただちに、Procmailが再度機能し始めます。

11.4.1. Procmailの設定

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

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

<env-variable>="<value>"

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

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

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

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

11.4.2. Procmailレシピ

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

正規表現についての完全な説明は、このセクションの担当範囲を越えています。 Procmailレシピの構成は、より重要でありサンプルのProcmailレシピがインターネットの さまざまなサイトで参照できます。(例えば:http://www.iki.fi/era/procmail/links.html) これらのレシピの例に中で見られる正規表現の正しい使用とその応用は、Procmailレシピの構成の 理解のレベルにより左右されます。基本的な正規表現規則の入門情報は、grepの manページで参照することが出来ます。

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.1. 配信レシピと非配信

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

メッセージを照合する配信レシピを使用すると、Procmailは指定されたアクションを実行し、 他のレシピに対するメッセージの比較を停止します。非配信レシピで条件に一致するメッセージは、 現行と以降のrcファイル内の他のレシピと比較され続けます。つまり、 非配信レシピを使用すると、メッセージに対して指定されたアクションがとられた後に メッセージがレシピ内を通り続けます。

11.4.2.2. フラグ

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

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

    現行のレシピでの照合を行う前に、この直前の照合用レシピでのアクションが正常終了したかどうかを確認するには、その代わりにaフラグを使用します。

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

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

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

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

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

    直前のレシピは一致したがアクションが失敗したときだけこのレシピをチェックしたい場合は、 eフラグを使用します。

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

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

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

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

    フィルタかアクションが成功したかどうかを判断するときに"Program failure"メッセージを 無視したいときは、その代わりにWオプションを使用します。

追加フラグは、procmailrcマニュアルページで見つけることができます。

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

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

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

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

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

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

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

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

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

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

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

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

  • | — パイプ文字は、特定のプログラムを起動してこのメッセージを処理するようにProcmailに指示します。

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

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

11.4.2.5. レシピの例

Procmailは非常に柔軟性のあるプログラムなので、メッセージをとても具体的な条件と照合し、 次にそれらのメッセージに対して詳細なアクションを実行できます。しかし、この柔軟性の結果、 始めからProcmailレシピを作成してある種の目的を実現することは、新規ユーザーにとって困難で ある可能性があります。

Procmailレシピ条件を構築するためのスキルを開発する最善の方法は、他の人が構築した多数の例を見ることで組み合わされた正規式をよく理解することから生まれます。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に送るように 指示します。

Procmailは主に電子メールのフィルタとして使用され、電子メールが手動で保存されることを 防止するために自動的に正しい場所に配置します。以下のレシピは特定のメーリングリストから 送られた電子メールを取り込んでそれを正しいフォルダーに置きます。

: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 はヘッダ解析、テキスト解析、ブラックリスト、スパム追跡データベースなど を使用し、スパムを識別してタグを付けます。

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

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

The /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