プロセルピナ
Top Internet
Mail
Private
Proxy
Capture
Device
Download Config
and
Words
Online
Help
Online
Home
[BACK]
Top > Mail > Filtering > Example

 

フィルタリング処理の流れ
(実行制御、フィルタ書式)
Mail Filter
Top | Menu | IpBlacklist | Bayesian | Edit | Commands   


「メールフィルタ」(振り分けフィルタ)フィルタエディタのフォームで作成します。


Fig.1: フィルタエディタのフォーム


 
メールフィルタの動作順序

メールフィルタを実行すると、 各々のメールについて、メールフィルタの先頭から末尾に向かう順序で 各行のフィルタコマンドが実行されます。これが基本の流れです。

それぞれのメールは、移動(move)されるか、削除(delete)されるまで、メールフィルタのコマンドが順番に適用されていきます。

次のメールフィルタは、「(1)中国からの(または経由した)メールを削除し、 (2)韓国からのメールをKoreaフォルダに移動し、 (3)その他のメールをBackUpフォルダにコピーして(4)フラグを立てる」 ものですが、 BackUpフォルダにコピーされてフラグが立てられるのは 中国からでも韓国からでもないメールのみになります。

 
if  IpList.via("CN")  delete
if  IpList.via("KR")  move  dir="F:\\mail\\Korea"
*  copy  dir="F:\\mail\\BackUp"
*  flag

 
Fig.2: 例1

この例では、中国(CN)からのメールは最初の行の「IpList.viaコマンド」で削除されるので、そこで 中国からのメールに対する このメールフィルタの適用は終了します。
韓国(KR)からのメールは2行目の「IpList.viaコマンド」で移動されるので、そこで 韓国からのメールに対する このメールフィルタの適用は終了します。
中国からでも韓国からでもないメールは、3行目の *コマンド(無条件実行コマンド) により、F:\mail\BackUpフォルダ にメールがコピーされます。 続いて同じく *コマンド(無条件実行コマンド) により、フラグが立てられます。


 
ラベルジャンプ

上記のように、メールフィルタは先頭から末尾に向かう順序で実行されますが、ラベルを使ったジャンプで 行を飛ばしたり、前の行に戻ったりすることができます。

次の例では、ayuayu@office.example.com から来たメールを、 ayuayu@home.example.com に転送してから、 AyuAyuというフォルダに移動しています。 それ以外のメールはこの転送と移動を行なわず、 Nextのラベルにジャンプし、その次のコマンドからメールフィルタの処理を続行します。

 
if  From.NotEquals("ayuayu@office.example.com")  Jump:Next
*  forward  From="ugoo@example.com"  To="ayuayu@home.example.com"  Id=7
*  move  dir="F:\\mail\\AyuAyu"
:Next
if  IpList.via("CN")  delete

 
Fig.3: ayuayu@office.example.comからのメールを転送して移動

1行目のFrom.NotEqualsコマンドで、メールが ayuayu@office.example.com から来ていなかった場合に、ラベルNextにジャンプしています。
From.NotEqualsコマンドは、メールのFromヘッダに記載されたメールアドレスが、 指定された文字列(ここではayuayu@office.example.com) と「一致しない(NotEquals)」かどうかをチェックするコマンドです。
一致した場合、つまり ayuayu@office.example.com からのメールだった場合は、ジャンプが無いので 次の行のコマンドが処理されます。 次の *コマンド(無条件実行コマンド) でforwardが指定されているので、ここでメールを ayuayu@home.example.com に転送し、 更に次の行の*コマンドのmoveで F:\mail\AyuAyu のフォルダに移動されます。
メールの移動が行われたので、 ayuayu@office.example.com からのメールの処理は ここで終了します。


 
他のフィルタを取込

フィルタの一部を別のファイルに保存しておき、それをフィルタリング実行時に呼び出すことができます。

例:
「中韓台.txt」の内容を次のFig.4のようなものとしたとき、 それをincludeで取り込んでいるメールフィルタ a.txt の内容がFig.5のようなものである場合、 a.txtの実行と、Fig.6のメールフィルタ b.txt の実行は 全く同じものになります。

 
if IpList.via("TW") dir="{{GTMAIL_HOME}}\\mbox\\work\\台湾"
if IpList.via("CN") dir="{{GTMAIL_HOME}}\\mbox\\work\\中国"
if IpList.via("KR") dir="{{GTMAIL_HOME}}\\mbox\\work\\韓国"

 
Fig.4: 中韓台.txt

 
include "{{GTMAIL_HOME}}\\ctrl\\filtering\\中韓台.txt"
if SPAM move local dir="{{GTMAIL_HOME}}\\trash"

 
Fig.5: a.txt (includeを使う場合)

 
if IpList.via("TW") dir="{{GTMAIL_HOME}}\\mbox\\work\\台湾"
if IpList.via("CN") dir="{{GTMAIL_HOME}}\\mbox\\work\\中国"
if IpList.via("KR") dir="{{GTMAIL_HOME}}\\mbox\\work\\韓国"
if SPAM move local dir="{{GTMAIL_HOME}}\\trash"

 
Fig.6: b.txt (includeを使わない場合)


 
Initially{...}

作成したフィルタは基本的に、全てのメールに対して先頭行から最終行に向かって順番に実行されます。 ただし、Initially{ ~ } で囲まれた範囲は、フィルタリング開始時に一回だけ実行されます。
Int[ ]の変数の初期化が必要な場合などに使用します。 まだメールに対してフィルタリングが開始されていない段階で実行される処理なので、メールに対する処理は Initially{ ~ } で囲まれた範囲に記述することができません。


 
Finally{...}

作成したフィルタは基本的に、全てのメールに対して先頭行から最終行に向かって順番に実行されます。 ただし、Finally{ ~ } で囲まれた範囲は、フィルタリング終了後に一回だけ実行されます。
printコマンドで最終的な結果を表示する場合などに使用します。 既にメールに対してフィルタリングが終了した後の段階で実行される処理なので、メールに対する処理は Finally{ ~ } で囲まれた範囲に記述することができません。

次のFig.7は フラグの立っていたメールをカウントし、 その結果を表示する例です。

 
if Flag.isExists() Int[0]+=1

Finally {
  print "フラグの立っていたメールの数=" + Int[0]
  }

 
Fig.7: フラグのあるメールをカウント

Fig.7「フラグのあるメールをカウント」の説明:
Flag.isExistsコマンドで メールにフラグがあった場合に 変数Int[0] に1を加算しています。
フィルタリングが終了すると、printコマンドで メッセージエリアに結果を表示しています。
結果は最後に一度だけ表示すればいいので、Finally{ ~ } に囲まれた範囲に記述します (囲まれていなかった場合、メールの数と同じだけのメッセージが表示されてしまいます)。
カウンタに使用している Int[0] などの変数は フィルタリング開始時に無条件に0で初期化されているので、 Initially{ ~ } で初期化する必要がありません。


 
State変数と Int[ ]変数

フィルタリングの中で変数を使うことができます。
変数には StateInt[ ] の2種類があり、 Stateはメール毎に0に初期化されるのに対し Int[ ]はフィルタリング開始時にのみ初期化されます。

Int[ ]は擬似配列なので [ ]内には0以上の数値を指定します。
Int[ ]の使用例は、上記の「Finally{...}」のFig.7の例を参照してください。 擬似配列Int[ ]を使ったやや複雑な例は「メールフィルタで使用する擬似配列の使用例」を参照してください。

次のFig.8の例は State変数 を使った振り分けの例です。

 
if Subject.Contains("Tea") State+=1 ignoreCase
if Subject.Contains("Coffee") State+=1 ignoreCase
if State==2 move dir="F:\\mail\\TeaAndCoffee"

 
Fig.8: 件名にTeaとCoffeeの両方があるメールを移動

1行目のSubject.Containsコマンドで メールの件名(Subject)に Tea の文字列が含まれるかをチェックしています。 ignoreCaseで修飾されているので、件名の Tea が大文字でも小文字でも一致します。 一致した場合にState値に1を加算しています。最初が0なので、State値は1になります。
2行目でこれと同じことを 今度はCoffeeの文字列を対象にして行います。 同じように、一致した場合にState値に1が加算されます。
3行目で State値が2になっていた場合に(State==2、==は半角の =記号 が2つ連続)、メールを F:\mail\TeaAndCoffee のフォルダに移動しています。

State変数は、1つのメールを処理すると0に初期化されてしまうことに注意してください。
次の例は、State変数を使って ベイジアンフィルタでジャンク(SPAM)と判定されたメールの数を数え、 最後にprintコマンドで表示しようとするものですが、 意図に反して常に0が表示されてしまいます。

 
if Bayesian State+=1

Finally {
print "Count="+State
}

 
間違った例 (常に Count=0 と表示されてしまう)

Finallyで変数を参照したい場合は、次のように Int[ ] の変数を使用します。

 
if Bayesian Int[10]+=1

Finally {
print "Count="+Int[10]
}

 
ベイジアンフィルタでジャンクと判定されるメールを数える


 
マクロの呼び出し

「プロセルピナ」のマクロを呼び出して、ヘッダ値の解析を行うこともできます。
次の「メールフィルタからマクロを呼び出す」のページでは、 優先度のヘッダ(X-Priority拡張ヘッダ)の判定を例にして説明しています。
→ メールフィルタからマクロを呼び出す
[BACK]
プロセルピナ