Show Table of Contents
15.4. メール配信エージェント(MDA)
Red Hat Enterprise Linux には Procmail と
mail の 2 つの主要 MDA が装備されています。どちらのアプリケーションも LDA とみなされ、電子メールを MTA のスプールファイルからユーザーのメールボックスに移動します。ただし、Procmail の方が堅牢なフィルタリングシステムを提供します。
このセクションでは、Procmail についてのみ詳しく説明します。
mail コマンドの詳細は、man ページ (man mail) を参照してください。
電子メールがローカルホストのメールスプールファイルに配置されると、Procmail が配信とフィルタリングを行います。Procmail は強力な上、システムリソースの使用が低いため、幅広く利用されています。Procmail は、電子メールクライアントアプリケーションが読み取る電子メールを配信するという重要な役割を果たします。
Procmail は、様々な方法で呼び出すことができます。MTA が電子メールをメールスプールファイルの中に配置すると、常にProcmail が起動します。次に、Procmail は電子メールを MUA のためにフィルタリング、ファイル保存して、終了します。別の方法としては、メッセージを受信すると常に Procmail を実行するように MUA を設定し、メッセージが正しいメールボックスに移動するようにできます。デフォルトでは、
/etc/procmailrc または ~/.procmailrc ファイル (別名 rc ファイル) がユーザーのホームディレクトリーにあると、MTA が新規メッセージを受信するたびに Procmail が呼び出されます。
デフォルトでは、
/etc ディレクトリーにはシステム全体の rc ファイルは存在せず、ユーザーのホームディレクトリーに .procmailrc ファイルは存在しません。このため、Procmail を使用するには、各ユーザーが特定の環境変数とルールを用いて .procmailrc ファイルを構築する必要があります。
Procmail が電子メールメッセージに対応するかどうかは、そのメッセージが
rc ファイルの特定の条件または レシピ と適合するかどうかによって決まります。あるメッセージが任意のレシピと適合する場合は、電子メールは特定のファイルに配置、削除、それ以外は処理されます。
Procmail が起動すると、電子メールメッセージを読み取り、ヘッダー情報から本文を切り離します。次に、Procmail は
/etc/procmailrcs/ ディレクトリー内の /etc/procmailrc ファイルと rc ファイルで、デフォルトのシステム全体の Pcocmail 環境用変数とレシピを探します。その後 Procmail は、ユーザーのホームディレクトリー内で .procmailrc ファイルを探します。多くのユーザーは、Procmail 用に追加の rc ファイルも作成します。これは、ホームディレクトリーの .procmailrc ファイル内で参照されます。
15.4.1. Procmail の設定
Procmail の設定ファイルには、重要な環境変数が含まれています。これらの変数は、並べ替えするメッセージ、およびどのレシピとも適合しないメッセージの処理を指定します。
これらの環境変数は通常
~/.procmailrc ファイルの冒頭に、以下のような形式で表示されます。
env-variable="value"
この例では、
env-variable が変数の名前で、value が変数を定義します。
大半の Procmail ユーザーが使用しない環境変数が多々あります。重要な環境変数の多くは、既にデフォルト値で定義されています。大抵の場合は、以下のような変数が使用されます。
DEFAULT— どのレシピにも適合しないメッセージが配置された場合のデフォルトのメールボックスを設定します。デフォルトのDEFAULT値は、$ORGMAILと同じです。INCLUDERC— 照合するメッセージに対する多くのレシピを格納する追加のrcファイルを指定します。これにより、Procmail レシピの一覧は、スパムのブロック、電子メール一覧の管理など異なる役割を果たす個別のファイルに分割されます。その結果、そうしたファイルは、ユーザーの~/.procmailrcファイル内のコメント文字を使用して、オンやオフにすることができます。例えば、ユーザーの~/.procmailrcファイル内の行は以下のようになります。MAILDIR=$HOME/Msgs INCLUDERC=$MAILDIR/lists.rc INCLUDERC=$MAILDIR/spam.rc
電子メールの一覧の Procmail フィルターをオフにしつつスパム制御を維持する場合は、最初のINCLUDERC行をハッシュ記号 (#) でコメントアウトします。現在のディレクトリーに相対的なパスが使用されることに注意してください。LOCKSLEEP— Procmail が特定のロックファイルの使用を試みる時間間隔を秒単位で設定します。デフォルトは8秒です。LOCKTIMEOUT— ロックファイルが最後に修正された後、Procmail がそれは古くて削除可能であると見なすまでに経過する必要のある時間を秒単位で設定します。デフォルトは1024秒です。LOGFILE— Procmail の情報やエラーメッセージが書き込まれるファイルです。MAILDIR— Procmail 用の現在作業中のディレクトリーを設定します。設定されると、他の Procmail のパスはすべてこのディレクトリーに対する相対パスになります。ORGMAIL— 元のメールボックス、またはデフォルトやレシピで必要な場所にメッセージを配置できなかった場合にメッセージを配置する別の場所を指定します。デフォルトでは、/var/spool/mail/$LOGNAMEの値が使用されます。SUSPEND— スワップ領域など必要なリソースが利用できない場合に、Procmail が一時停止する時間を秒単位で設定します。SWITCHRC— 追加の Procmail レシピが格納されている外部ファイルをユーザーが指定できるようにします。これは、INCLUDERCオプションとよく似ていますが、レシピのチェックが参照先の設定ファイル上で実際に停止され、SWITCHRCの指定するファイル上のレシピのみが使用される点が異なります。VERBOSE— Procmail が詳細な情報をログ記録するようにします。このオプションはデバッグに役立ちます。
その他の重要な環境変数は、シェルから引き出されます。例えば、ログイン名の
LOGNAME、ホームディレクトリーの場所である HOME、デフォルトのシェルである SHELL などです。
環境変数すべてについての包括的な説明やデフォルト値については、
procmailrc の man ページを参照してください。
15.4.2. Procmail のレシピ
多くの場合、新規ユーザーが Procmail の使用法を学習するにあたって最も難しいと感じるのは、レシピの構築です。これは、レシピが適合するストリングの条件を指定するために 正規表現 を使用してメッセージ照合を行うためです。ただ、正規表現の構築はそれほど難しくなく、読んで理解することも簡単です。その上、Procmail のレシピを書く方法は、正規表現にかかわらず一貫性があるため、例を使って学習すると簡単です。Procmail のレシピの例は、「レシピの例」 を参照してください。
Procmail レシピは以下の書式を使用します:
:0 [flags] [: lockfile-name ] * [ condition_1_special-condition-character condition_1_regular_expression ] * [ condition_2_special-condition-character condition-2_regular_expression ] * [ condition_N_special-condition-character condition-N_regular_expression ] special-action-character action-to-perform
Procmail レシピの最初の 2 文字は、コロンとゼロです。ゼロの後に様々なフラグを配置して、Procmail がレシピを処理する方法を制御します。
flags セクションの後ろにコロンを付けると、このメッセージ用にロックファイルが作成されることを示しています。ロックファイルが作成されると、その名前は lockfile-name を置き換えて指定することが可能です。
レシピは、メッセージと適合させる様々な条件を格納できます。条件がない場合は、あらゆるメッセージがレシピと適合することになります。正規表現は、メッセージ照合を容易にするために、一部の条件で使用されます。複数の条件を使用する場合、アクションが実行されるためにはすべてが適合しなければなりません。条件は、レシピの 1 行目に設定されているフラグに基づいてチェックされます。アスタリスク文字 (
*) の後にオプションの特殊文字を配置すると、さらに条件を制御できます。
action-to-perform 引数は、メッセージが条件の 1 つに適合する場合にアクションを実行するよう指定します。1 つのレシピにつき 1 つのアクションのみとなります。多くの場合、メールボックスの名前がここで使用され、適合するメッセージをファイルに誘導し、電子メールを効果的に並べ替えます。特別なアクションの文字は、アクションが指定される前に使用することもできます。詳細は 「特別な条件とアクション」 を参照してください。
15.4.2.1. 配信レシピと非配信レシピの比較
レシピがある特定のメッセージと適合した場合に使用されるアクションにより、それが 配信 レシピ、または 非配信 レシピと見なされるかが判断されます。配信レシピには、ファイルへのメッセージの書き込み、別のプログラムへのメッセージ送信、別の電子メールアドレスへのメッセージ転送などのアクションが含まれています。非配信レシピは、ネストされたブロック などその他のアクションをカバーします。ネストされたブロックは、中括弧
{ } で囲まれたアクションセットで、レシピの条件に適合するメッセージで実行されます。ネストされたブロックは、互いにネストさせることができるため、メッセージに対するアクションを特定、実行するにあたっての制御力が強化されます。
メッセージが配信レシピと適合すると、Procmail は指定されたアクションを実行し、その他のレシピとメッセージとの比較を停止します。非配信レシピと適合するメッセージの場合は、他のレシピに対する照合は継続されます。
15.4.2.2. フラグ
フラグは、レシピの条件をメッセージに照合する方法、またはそれを行うかどうかを決定するにあたって不可欠です。egrep ユーティリティーは条件の照合のために内部で使用されます。一般的に使用されるフラグは以下のとおりです。
A—Aやaのフラグが付いていない以前のレシピもこのメッセージに適合する場合にのみ、このレシピが使用されることを指定します。a—Aやaのフラグが付いた以前のレシピもこのメッセージに適合し、かつ 正常に完了した場合にのみこのレシピが使用されることを指定します。B— メッセージの本文を解析し、適合する条件を検索します。b— ファイルへのメッセージの書き込みや転送など、結果として生じるアクションにその本文を使用します。これはデフォルトの動作です。c— 電子メールのカーボンコピーを生成します。必要なアクションをメッセージで実行し、メッセージのコピーはrcのファイル内で引き続き処理することができるため、レシピの配信に役立ちます。D—egrepの照合で大文字と小文字を区別します。デフォルトでは、照合プロセスでは大文字と小文字を区別していません。E—Aフラグと類似していますが、レシピ内の条件は、直前にあるEフラグなしのレシピが適合しない場合のみに、メッセージと照合されます。これは else アクションと類似しています。e— 直前のレシピで指定されたアクションが失敗した場合のみ、レシピがメッセージに照合されます。f— フィルターとしてパイプを使用します。H— メッセージのヘッダーを解析し、適合する条件を検索します。これはデフォルトの動作です。h— 結果として生じるアクションでヘッダーを使用します。これはデフォルトの動作です。w— Procmail に対して、指定されたフィルターまたはプログラムが終了するのを待ち、メッセージがフィルターされたと見なす前に正常に終了したかどうかを報告するよう指示します。W— 「プログラム障害」のメッセージが抑制されている点を除いてはwと全く同じです。
その他のフラグの詳細な一覧は、
procmailrc の man ページを参照してください。
15.4.2.3. ローカルロックファイルの指定
ロックファイルは、Procmail で複数のプロセスが 1 つのメッセージを同時に変更しないようにするために非常に役立ちます。ローカルロックファイルを指定するには、レシピの 1 行目の任意のフラグの後にコロン (
:) を配置します。これにより、送信先のファイル名に基づいたローカルロックファイルと、LOCKEXT のグローバル環境変数で設定されたものすべてが作成されます。
別の方法としては、このレシピで使用するローカルロックファイルの名前をコロンの後に指定します。
15.4.2.4. 特別な条件とアクション
Procmail レシピの条件とアクションの前に使用される特殊文字により、解釈の仕方が変わります。
以下の文字は、レシピの条件の行頭でアスタリスク文字 (
*) の後に使用できます。
!— 条件の行では、この文字により条件が反転し、条件がメッセージに一致しない場合にのみ、適合が発生するようになります。<— メッセージが指定されたバイト数内に収まっているかどうかを確認します。>— メッセージが指定されたバイト数を超えているかどうかを確認します。
以下の文字は、特別なアクションを実行するために使用されます。
!— アクションの行では、この文字は Procmail にメッセージを指定された電子メールアドレスに転送するように指示します。$—rcファイルで以前に設定された変数を参照します。多くの場合、様々なレシピによって参照される共通のメールボックスを設定するために使用されます。|— メッセージを処理するための特定のプログラムを起動します。{および}— 適合するメッセージに適用する追加のレシピを格納するために使用される、ネストされたブロックを構築します。
アクションの行頭に特殊文字を使用しない場合、Procmail はアクションの行がメッセージを書き込むためのメールボックスを指定していると仮定します。
15.4.2.5. レシピの例
Procmail は極めて柔軟性の高いプログラムですが、この柔軟性が原因で、新規ユーザーが Procmail のレシピを一から作成するのが難しい場合があります。
Procmail レシピの条件を構築するスキルを向上させる最適な方法は、正規表現をしっかり理解することに加えて、他の人が構築した多くの例を参照することから始まります。正規表現についての詳細な説明は、本セクションの範囲外となります。Procmail のレシピの構造と役立つ Procmail のサンプルレシピは、インターネット上の様々なところに掲載されています。正規表現の適切な使用、調整方法は、これらのレシピ例を参照してください。また、基礎的な正規表現のルールに関する初歩的な情報は、
grep(1) の 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 に送信して永久に削除してしまう前に、ルールが目的どおりに機能していることを確認してください。レシピが間違えて目的以外のメッセージを対象にすると、それらのメッセージは消えてしまい、ルールのトラブルシューティングが困難になります。
この問題に対処する優れた方法としては、レシピのアクションを特別なメールボックスに移動させることです。これで、メールボックスを時折確認して、誤検知を探すことができます。メッセージが間違って適合されることがなく満足できる状態になったら、そのメールボックスは削除して、メッセージを
/dev/null に送信するよう指示します。
以下のレシピでは、特定のメーリングリストから送信された電子メールを取得して、特定のフォルダに配置します。
:0: * ^(From|Cc|To).*tux-lug tuxlug
tux-lug@domain.com のメーリングリストから送信されたメッセージはすべて、MUA 用に自動的に tuxlug メールボックスに配置されます。From、Cc、To の行にメーリングリストの電子メールアドレスが入っている場合は、この例の条件がメッセージに適合する点に注意してください。
さらに詳しい強力なレシピについては、「関連資料」 の Procmail に関する数々のオンライン資料を参照してください。
15.4.2.6. スパムフィルター
Procmail は、新規の電子メールを受信すると Sendmail、Postfix、Fetchmail によって呼び出されるため、スパム対策の強力なツールとして使用できます。
これは、Procmail が SpamAssassin と併用された場合に特に有効です。これらの 2 つのアプリケーションを併用すると、スパムメールを迅速に特定して、並び替えまたは破棄することができます。
SpamAssassin はヘッダー分析、テキスト分析、ブラックリスト、スパム追跡データベース、自己学習型 Bayesian スパム分析を使用して、迅速かつ正確にスパムの特定とタグ付けを行います。
注記
SpamAssassin を使用するには、
root で以下を実行して、最初にご使用のシステムに spamassassin パッケージがインストールされていることを確認します。
~]# yum install spamassassin
yum を使ったパッケージのインストールについては 「パッケージのインストール」 を参照してください。
ローカルユーザーが SpamAssassin を使用する最も簡単な方法は、
~/.procmailrc ファイルの最上部付近に以下の行を配置することです。
INCLUDERC=/etc/mail/spamassassin/spamassassin-default.rc/etc/mail/spamassassin/spamassassin-default.rc には、シンプルな Procmail ルールが格納されており、受信するすべての電子メールに対して SpamAssassin をアクティブ化します。電子メールがスパムであると判断された場合には、ヘッダー内でタグ付けされて、タイトルの先頭には以下のようなパターンが追加されます。
*****SPAM*****
電子メールのメッセージ本文にも、スパム診断の理由となった要素の継続的な記録が先頭に追加されます。
スパムとしてタグ付けされた電子メールをファイル保存するには、以下と同様のルールを使用することができます。
:0 Hw * ^X-Spam-Status: Yes spam
このルールにより、スパムとしてヘッダーにタグ付けされた電子メールはすべて、
spam と呼ばれるメールボックスにファイル保存されます。
SpamAssassin は Perl スクリプトであるため、ビジー状態のサーバーではバイナリ SpamAssassin デーモン (
spamd) とクライアントアプリケーション (spamc) を使用する必要がある場合があります。ただし、SpamAssassin をこのように設定するには、ホストへの root アクセスが必要です。
spamd デーモンを起動するには、以下のコマンドを入力します。
~]# systemctl start spamassassin
システムの起動時に SpamAssassin デーモンを起動するには、以下のコマンドを実行します。
systemctl enable spamassassin.service
サービスの起動および停止に関する詳細については、10章systemd によるサービス管理 を参照してください。
Procmail が Perl スクリプトではなく、SpamAssassin クライアントアプリケーションを使用するように設定するには、
~/.procmailrc ファイルの最上部付近に以下の行を配置します。システム全体の設定の場合は、/etc/procmailrc に配置してください。
INCLUDERC=/etc/mail/spamassassin/spamassassin-spamc.rc
Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.