複数のメールルールを定義する場合、条件にマッチするルールが2つ以上あると、その順番や処理内容によっては意図したとおりに動作しないことがある。あるルールの適用後、ほかのルールを適用させたくない場合は、ルール処理を中断させるアクションを明示的に定義する必要がある。デフォルトのルールを表現するには、ルール定義リストの先頭に置くか、各ルールの最後に必ず処理の中断アクションを置くようにする。
対象ソフトウェア:Outlook 2003/Outlook Express
Tech TIPS「メッセージルールを活用する(Outlook Express編)」では、メールの自動分類などに利用できる、メッセージルール(以下、Outlook 2003の「仕訳ルール」とまとめて、メールルールと呼ぶことにする)の使い方について解説した。メールルールとは、受信したメールがある「条件」にマッチした場合、指定された「アクション」を実行するというものである。
このように、メールルールは複数定義することができ、さまざま条件でフォルダに分類したり、削除したり、メールメッセージの表示色を変更したりできる。
ところでこのダイアログを見ると、各ルールの順番(処理順序)を変更するための[上へ]と[下へ]という2つのボタンがある(画面中の(2)と(3))。Outlook 2003の[仕訳ルールと通知]ダイアログにも同様に、ルールの並び順を変更するための[↑(上へ)]と[↓(下へ)]という2つのボタンが用意されている。あるルールを選択してからこれらのボタンをクリックすることにより、ルールの置かれる位置が変わり、その処理の順番が変更される。
さてこのように複数のルールが定義されている場合、あるメールメッセージが2つ以上のルール(条件)にマッチしたとすると、どのように動作するだろうか。直感的には次の図のように、ある条件にマッチすると、それに該当するアクションが実行され、このメールに対する処理はそこで終了し(図中の「STOP」)、次のメールメッセージの処理(マッチする条件の検索とアクションの実行)へ移ると考えられる。
あるメールメッセージがたとえ複数のルールにマッチするとしても(マッチするルールが複数定義されているとしても)、一番上にある1つのルールのみが実行されると考えられる。これは、例えばルータにおけるパケットフィルタの処理で行われている挙動である。ルータのパケットフィルタでは、ある特定のプロトコルやIPアドレス、ポート番号などで条件を定義し、それにマッチした場合は、パケットを通過させたり、ブロック(拒否/破棄)させたりする。例えばTCPの80番ポートに対するアクセスだけを許可すると、Webサーバに対するアクセスだけを許可できる。
だがOutlook ExpressやOutlook 2003における実際のメールルールの処理は、このような動作にはなっていない。ある条件にマッチするルールを見つけると、そのアクションを実行した後、さらに次のルールとマッチするかどうかが調べられるのである。つまり、あるアクションを実行しても、メールルールの処理はそこでは終了せず、次のルールの処理へと進む。その結果、すべてのルールが処理され、条件にマッチすれば、そのアクションが実行される。これを図にすると、次のようになる。
もしあるメールにマッチするメールルールが1つしか定義されていなければ、このような挙動でも問題はない。メールはどれか1つの条件にかマッチせず、実行されるアクションもただ1つしかないからである。
だがもし複数の条件にマッチするようなら、複数のアクションが実行されることになる。お互いに影響のないアクションならばそれらが順番に実行されるだけだが、同じ操作を行うアクションの場合は注意が必要である。例えばアクション1が「フォルダ1への移動」、アクション2が「フォルダ2への移動」ならば、受信したメールはまずフォルダ1へ移動するが、すぐにアクション2が適用され、最終的にはフォルダ2へ移動することになる。
このような事態を防ぎ、意図したとおりにルールを適用させるには、各アクションの最後で、それ以上の処理を中止させるという処理を行えばよい。Outlook Expressでは[ルールの処理を中止する]という処理を選択すればよいし、Outlook 2003の場合は[仕訳ルールの処理を中止する]という処理を選択する。デフォルトではこの処理は忘れがちなので、注意が必要である。
Outlook 2003の場合もほぼ同様のアクションが用意されているので、それを利用する。Outlook 2003ではアイコンを使ってアクションの内容を分かりやすく表示しており、処理の中断は「×」印のような形のアイコンで表されている。
ところで、メールルールを多数定義してメールを細かく各フォルダに分類したあと、それ以外のすべてのメール(どのルールにもマッチしないメール)をまとめて、例えば「未整理フォルダ」というフォルダに分類したいとする。分類フォルダの内容は、あとで必要に応じて手動で整理したり、まとめて削除したりすればよいだろう。
このような処理を行うためには、どのルールにもマッチしない場合に実行される、デフォルトのメールルールを定義すればよい。具体的には、次のいずれかの方法が利用できる。
まずすべてのルールのアクション部において、その最後に「処理の中断」という動作を選択しておく。そしてルール定義リストの一番下(最後に実行されるルール)に、「すべてのメールに対して、未整理フォルダへ移動する」というルールを新たに定義すればよい。こうしておけば、条件がマッチしたアクションは実行されるが、その最後に処理の中断があるので、それ以上の処理は行われなくなる。そして、どの条件にもマッチしない場合に限って、最後のルールが適用されることになる。なお「すべてのメールに対して」という条件を指定するには、Outlook Expressでは[すべてのメッセージに適用する]というチェックボックスを選択する。Outlook 2003の場合は、仕分けルールの条件部において、チェックボックスを1つも選択しない状態にすればよい。こうするとすべてのメールにマッチするという条件になる。
この方法は、いわば正攻法とでもいうべき方法であるが、いちいち各アクションの最後に「処理の中断」という動作を入れなければならない。もしそれを忘れていると、意図しない動作(分類したはずのメールがすべて未整理フォルダへ移動させられる)が起こる可能性があるので注意が必要である。そこで、次のような方法を使うのもよいだろう。
複数のルールが存在している場合、ルール定義リストの先頭から順番に実行され、同じ処理ならば後のルールの方が意味を持つ、という挙動を生かしたのがこの方法である。「すべてのメールに対して、未整理フォルダへ移動する」というルールを定義リストの先頭に挿入しておく。当然このルールは最初に実行されるが、もし後続のルールにマッチしてフォルダ移動が行われれば、そちらが意味を持つ。この結果、後続のどのルールにもマッチしない場合に限って、未整理フォルダへ移動することになる。方法1と違って、各ルールの最後に「処理の中断」という動作を入れなくてもよいし、もし入れ忘れたとしても、動作には影響はない。
以上の方法を組み合わせれば、もっと複雑な条件やアクションを記述できるので、工夫してみてほしい。例えば、送信者アドレスによってメールの色を分類して、どこの社のだれの発言かを分かりやすくする例を考えてみよう。自組織(自社)ドメインが送信元になっているメールを青色にし、さらにその中でも特に自分が出したメールは赤色にしてみる。この場合のルールとしては、まず先頭に「送信者アドレスが“@example.co.jp”ならメールを青にする」というルールを定義し、2番目には「送信者アドレスが“myaddress@example.co.jp”ならメールを赤色にする」というルールを定義する。いずれのルールでも、フォルダ移動などはなく、単にメールの件名の色が変わるだけである。これにより、後続のフォルダ分けルールに影響を与えることなくメールの色を変更できる。
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.