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設定ファイル、特にユーザーの.procmailrcには、ある種の重要な環境変数が含まれています。これらの変数は、どのメッセージをソートするか、レシピに一致しないメッセージをどう処理するかなどをProcmailに指示します。
これらの環境変数は通常、始めに.procmailrcファイル内に次のフォーマットでそれぞれ独自の行に表示されます。
この例で、<env-variable>は変数名であり、<value>セクションは変数を定義します。
大半の環境変数はほとんどのProcmailユーザーに使用されず、それより重要な環境変数の多くはすでにデフォルト値が定義されています。ほとんどの期間は、次の変数を処理します。
DEFAULT —レシピに一致しないメッセージが設定されるデフォルトのメールボックスを設定します。
デフォルトのDEFAULT値は、$ORGMAILと同じです。
INCLUDERC —再度チェックするメッセージのためのレシピをさらに含む追加rcファイルを指定します。このため、スパムのブロッキングや電子メールリストの管理などのさまざまな役割を満たす個々のファイルにProcmailレシピを分解し、次にユーザーの.procmailrcファイル内のコメント文字を使用してそれらの役割をオン/オフに切り替えることができます。
たとえば、ユーザーの.procmailrcファイルの2つの行は、次のように表示されます。
MAILDIR=$HOME/Msgs INCLUDERC=$MAILDIR/lists.rc INCLUDERC=$MAILDIR/spam.rc |
図 16-8. 使用するINCLUDERCオプションの例
ユーザーが電子メールリストのProcmailフィルタ処理をオフに切り替えたいが、スパム制御は所定の位置に残したい場合、#文字で最初のINCLUDERC行を簡単にコメント化することができます。
LOCKSLEEP — Procmailが特定のロックファイルを使おうとする試行と試行の間の時間数を秒単位で設定します。デフォルトは8秒です。
LOCKTIMEOUT —ロックファイルが古くて削除できるとProcmailが判断するまでに、ロックファイルが最後に変更されてから経過しなければならない時間数を秒単位で設定します。デフォルトは1,024秒です。
LOGFILE — Procmailの情報メッセージかエラーメッセージのいずれかを含むロケーションとファイル。
MAILDIR — Procmailにカレント作業ディレクトリを設定します。設定すると、他のProcmailパスはすべてこのディレクトリを基準にします。
ORGMAIL —オリジナルメールボックスを指定するか、メッセージをデフォルトロケーションかレシピが要求するロケーションに設定できない場合にメッセージを設定する別の場所を指定します。
デフォルトでは、/var/spool/mail/$LOGNAMEの値が使用されます。
SUSPEND —スワップスペースなどの必要なリソースがない場合にProcmailが休止する時間数を秒単位で設定します。
SWITCHRC —このオプションを使用すると、追加のProcmailレシピを含む外部ファイルを指定できます。レシピチェックが実際に参照用設定ファイル上で停止し、SWITCHRCで指定されたファイル上のレシピだけが使用されること以外、INCLUDERCオプションと非常に似ています。
VERBOSE —このオプションを使用すると、Procmailは非常に多くの情報をログにとることができます。このオプションはデバッグに便利です。
他の重要な環境変数は、ログイン名であるLOGNAME、ホームディレクトリのロケーションであるHOME、デフォルトシェルであるSHELLなどのシェルから抜き出されます。
すべての環境変数とそれらのデフォルト値に関するわかりやすい説明は、procmailrcマニュアルページにあります。
新規ユーザーは、多くの場合、レシピの作成を、Procmailを使用するための最も困難な学習領域と思っています。ある程度、このことは理解できます。それは、レシピが照合用文字列に修飾を指定するための特別なフォーマットである正規式を使用してメッセージの照合を行うからです。ただし、正規式はそれほど設定しにくかったり、読み取るときに理解しにくかったりするものではありません。また、Procmailレシピを書く方法の一貫性は、正規式とは無関係に、何が行われているかを検出することを容易にします。
正規式を詳細に説明することは、この章の範囲を超えているので行いません。Procmailレシピの構造のほうが重要であり、便利なProcmailレシピのサンプルはhttp://www.iki.fi/era/procmail/links.htmlなどインターネット上のさまざまな場所で見つけることができます。これらのレシピ例で見つかる正規式の正しい使用法は、Procmailレシピ構造の理解度により異なります。基本的な正規式の規則に固有な導入情報は、grepマニュアルページに見つけることができます。
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> |
図 16-9. Procmailレシピの構造
Procmailレシピの最初の2文字はコロン(:)と0です。このレシピを処理するときにProcmailが何をするかを制御するには、オプションとして0の後に各種フラグを設定できます。<flags>セクションの後のコロンは、このメッセージのためのロックファイルを作成することを指定します。ロックファイルを作成する場合は、<lockfile-name>スペースでその名前を指定します。
レシピには、メッセージと照合するいくつかの条件を含めることができます。条件がない場合、すべてのメッセージはレシピに一致します。メッセージとの照合を容易にするために、正規式がいくつかの条件で設定されます。複数の条件を使用する場合、アクションを実行するためにこれらの条件がすべて一致しなければなりません。条件は、レシピの最初の行で設定されたフラグに基づいてチェックされます。*文字の後に設定されたオプションの特別な文字は、さらに条件を制御できます。
<action-to-perform>は、条件のうちの1つに一致する場合にメッセージに対して何が発生するかを指定します。レシピごとにアクションは1つしか指定できません。多くの場合、ここではメールボックスの名前を使用して照合用のメッセージをそのファイルに送り、電子メールを有効にソートします。アクションを指定する前にも、特別なアクション文字を使用できます。
レシピが特定メッセージに一致する場合に使用されるアクションは、レシピが配信と非配信のいずれかであるかを決定します。配信レシピには、ファイルにメッセージを書き込んだり、別のプログラムにメッセージを送ったり、別の電子メールアドレスにメッセージを転送したりするアクションが含まれています。非配信レシピは、ネスト用ブロックを使用するときなどの他のアクションをカバーします。ネスト用ブロックは、レシピの条件に一致する追加アクションを指定する中かっこ{ }に囲まれたアクションです。ネスト用ブロックをネストして、メッセージ上のアクションを識別して実行するためのさらに大きな制御を与えることができます。
メッセージを照合する配信レシピを使用すると、Procmailは指定されたアクションを実行し、他のレシピに対するメッセージの比較を停止します。非配信レシピで条件に一致するメッセージは、現行と以降のrcファイル内の他のレシピと比較され続けます。つまり、非配信レシピを使用すると、メッセージに対して指定されたアクションがとられた後にメッセージがレシピ内を通り続けます。
フラグは、どのようにレシピの条件をメッセージと比較するか、あるいはレシピの条件をメッセージと比較するかどうかを決定する際に非常に重要です。次のフラグが一般に使用されます。
A —このレシピがAフラグか、aフラグのない最後の直前のレシピもこのメッセージに一致した場合のみ使用されることを指定します。
現行のレシピでの照合を行う前に、この直前の照合用レシピでのアクションが正常終了したかどうかを確認するには、その代わりにaフラグを使用します。
B —メッセージの本文を構文解析し、一致する条件を探します。
b —メッセージをファイルに書き込んだり転送したりするなどの結果的なアクションで本文を使用します。これはデフォルトの動作です。
c —電子メールのカーボンコピーを作成します。これが配信レシピで便利なのは、必要なアクションをメッセージ上で実行でき、メッセージのコピーをrcファイルで処理し続けることができるからです。
D — egrepの比較を大文字と小文字を区別するものにします。デフォルトでは、比較プロセスは大文字と小文字を区別しません。
E — Eフラグのない直前のレシピが一致しなかった場合にこのレシピ内の条件がメッセージと比較されること以外は、Aフラグと同じです。これは、elseアクションに匹敵します。
直前のレシピは一致したがアクションが失敗したときだけこのレシピをチェックしたい場合は、その代わりにeフラグを使用します。
f —パイプをフィルタとして使用します。
H —メッセージのヘッダーを構文解析し、一致する条件を探します。これは、デフォルトで行われます。
h —結果のアクションでヘッダーを使用します。これはデフォルトの動作です。
w —指定されたフィルタか、プログラムが終了するまで待機し、フィルタ処理されたメッセージを考慮する前にそのフィルタか、プログラムが成功したかどうかを報告するようにProcmailに指示します。
フィルタかアクションが成功したかどうかを判断するときに"Program failure"メッセージを無視したいときは、その代わりにWオプションを使用します。
追加フラグは、procmailrcマニュアルページで見つけることができます。
ロックファイルは、複数のプロセスが同時にある種のメッセージを変更しようとしないようにするためにProcmailでは非常に便利です。レシピの最初の行のフラグの後にコロン(:)を設定することによって、ローカルロックファイルを指定できます。このため、宛先のファイル名とLOCKEXTグローバル環境変数で設定されたすべてのものに基づいて、ローカルロックファイルが作成されます。
別の方法として、コロンの後にこのレシピで使用するローカルロックファイルの名前を指定できます。
Procmailレシピの条件とアクションの前に使用される特別な文字は、それらの条件とアクションを解釈する方法を変更します。
レシピの条件行の先頭にある*文字の後に、次の文字を使用できます。
! —条件を反転するため、条件がメッセージに一致しない場合のみ照合が行われます。
< —メッセージが指定数のバイトより少ないかどうかを確認します。
> —メッセージが指定数のバイトより多いかどうかを確認します。
特別なアクションを実行するには、次の文字を使用します。
! —指定された電子メールアドレスにメッセージを転送するようにProcmailに指示します。
$ — rcファイル内で最初に設定された変数を参照します。これは通常、各種レシピで参照される一般的なメールボックスを設定する場合に使用します。
| —パイプ文字は、特定のプログラムを起動してこのメッセージを処理するようにProcmailに指示します。
{ and } —追加レシピを組み込んで照合用メッセージに適用するためのネスト用ブロックを作成します。
アクション行で特別な文字を使用しない場合、Procmailではメッセージを書かなければならないメールボックスをそのアクション行が指定していると仮定します。
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に示す次の一時的なフィルタ処理の解決方法を考慮してください。この場合、複数のレシピが一般的なメールボックスを使用してジャンクを保存するよう設定されます。
SPAM=junk :0: * To??^$ $SPAM :0: * ^(To|CC):.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*, $SPAM :0: * ^Message-Id:.*<[^@]*> $SPAM |
図 16-13. 基本的なスパムフィルタの例
この例では、junkメールボックスがSPAM変数に関連付けられているため、ある場所にスパムを保持するメールボックスを変更できます。次に、3つのレシピはjunkメールボックスに送るメッセージを探します。
第1のレシピは、 To行に受信者を持たないメッセージを探します。第2のレシピは、すべてのメッセージを12人以上の受信者と照合します。第3のレシピは不正なメッセージIDを持つメッセージを探します。
これらの簡単な例を示したのは、レシピの作成を容易に開始できるようにするためです。さらに詳細で強力なレシピを見るには、追加リソース項から得られる多数のProcmailオンラインリソースを参照してください。