Procmail

Procmailを使用すると、電子メールがリモート電子メールサーバーから受信されるか、ローカルの電子メールサーバーか、リモート電子メールサーバー上のスプールファイルにあるときに、電子メールをフィルタ処理することができます。Procmailは強力で、システムリソースに対してやさしく、そして幅広く利用されています。Procmailは一般にLocal Delivery Agent(LDA)と呼ばれ、MUAで読み取られる電子メールを配信する際には少々の役割を果たします。

Procmailを使用するには、まずProcmailをインストールする必要があります。rpm -q procmailコマンドを入力して、procmailパッケージがインストールされているかどうかを確認します。何らかの理由でProcmailがシステム上にない場合は、Red Hat Linuxインストール用CD-ROMからインストールします。

Procmailは、いくつかの方法で呼び出すことができます。電子メールが電子メールスプールファイルに設定されると、Procmailは起動するように設定され、MUAで使用するように設定されたロケーションへの電子メールをフィルタ処理し、終了します。あるいは、メッセージが受信されるたびにProcmailを呼び出して、メッセージが正しいメールボックスに移動されるように、MUAを設定することができます。多くの場合、ユーザーのホームディレクトリに.procmailrcファイルが存在すると、Sendmailが使用されていれば、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がもう1度機能し始めます。

Procmailの設定

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

これらの環境変数は通常、始めに.procmailrcファイル内に次のフォーマットでそれぞれ独自の行に表示されます。

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

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

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

すべての環境変数とそれらのデフォルト値に関するわかりやすい説明は、procmailrcマニュアルページにあります。

Procmailレシピ

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

正規式を詳細に説明することは、この章の範囲を超えているので行いません。Procmailレシピの構造のほうが重要であり、便利なProcmailレシピのサンプルはhttp://www.iki.fi/era/procmail/links.htmlなどインターネット上のさまざまな場所で見つけることができます。これらのレシピ例で見つかる正規式の正しい使用法は、Procmailレシピ構造の理解度により異なります。基本的な正規式の規則に固有な導入情報は、grepマニュアルページに見つけることができます。

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

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

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

<action-to-perform>は、条件のうちの1つに一致する場合にメッセージに対して何が発生するかを指定します。レシピごとにアクションは1つしか指定できません。多くの場合、ここではメールボックスの名前を使用して照合用のメッセージをそのファイルに送り、電子メールを有効にソートします。アクションを指定する前にも、特別なアクション文字を使用できます。

フラグ

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

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

レシピの例

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

Procmailレシピ条件を構築するためのスキルを開発する最善の方法は、他の人が構築した多数の例を見ることで組み合わされた正規式をよく理解することから生まれます。Procmailレシピの構造のデモンストレーションの役割を果たす次の非常に基本的な例があり、それはさらに複雑な構造の基礎を与えることができます。

最も基本的なレシピには、図16-10に示すような条件さえ含まれていません。

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

この基本的なレシピはすべてのrcファイルの終わりにあり、メッセージをデフォルトロケーションに送ることができます。さらに複雑な例では、図16-11に見られるように、特定の電子メールアドレスからメッセージを取り出して廃棄します。

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

注意重要
 

規則に合致するメッセージを/dev/nullに移動する(永久削除)前に、規則が正しく機能していることに注意してください。レシピ条件で誤って意図していないメッセージを把握しても、送信者が伝えて来ないかぎりこれらのメッセージを見逃していることがわかりません。

より良い解決方法として、 false positives、すなわち、偶然に条件に一致したメッセージを探すためにときどきチェックできる特別なメールボックスにレシピのアクションを指示することです。偶然に一致しているメッセージがないと思った場合、メールボックスを削除し、/dev/nullにメッセージを送るようにアクションを指示できます。

Procmailは主に電子メールのフィルタとして使用され、電子メールを手動でソートする必要がないように正しい位置に設定します。図16-12内のレシピは特定のメーリングリストから送られた電子メールを把握し、正しいフォルダに設定します。

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

Procmailを使用してスパムを阻止できますが、これはジャンクメールに適した長期の解決方法ではありません。図16-13に示す次の一時的なフィルタ処理の解決方法を考慮してください。この場合、複数のレシピが一般的なメールボックスを使用してジャンクを保存するよう設定されます。

この例では、junkメールボックスがSPAM変数に関連付けられているため、ある場所にスパムを保持するメールボックスを変更できます。次に、3つのレシピはjunkメールボックスに送るメッセージを探します。

第1のレシピは、 To行に受信者を持たないメッセージを探します。第2のレシピは、すべてのメッセージを12人以上の受信者と照合します。第3のレシピは不正なメッセージIDを持つメッセージを探します。

これらの簡単な例を示したのは、レシピの作成を容易に開始できるようにするためです。さらに詳細で強力なレシピを見るには、追加リソースから得られる多数のProcmailオンラインリソースを参照してください。