Modifierプラグイン

Modifierプラグインはメッセージの各パーツを変更します(テキストをメッセージ本文に追加する、疑わしい添付ファイルをリネームするなど)。Dr.Web Modifierは基本正規表現、拡張正規表現、およびPerl互換正規表現に対応しています。

Modifierプラグインの設定ファイル内で指定できるルールには4つの種類があります。

1つ目はメッセージ全体に適用されるルールです。

pass、accept - メッセージを許可します。グローバルルールで処理された場合、メッセージ変更プラグインに関する以後の処理を一切行わずにメールデーモンにメッセージを許可することを通知し、プラグインとしての処理を終了します。ローカルルールで処理された場合、以後のローカルルールの処理は行わずにグローバルルールの処理を開始します。
reject - メッセージを拒否して送信者に通知します。
discard - 通知せずにメッセージを拒否します。
notify - 管理者に通知します。このコマンドの後、通知の作成に使用するレポートテンプレートの名前を指定してください。そうでない場合、メッセージ処理の間にエラーメッセージが表示されます。テンプレートはディレクトリ内にあり、そこへのパスはDr.Web MailD設定ファイルのTemplatesBaseDirパラメータの値で指定されます。

例:

GlobalRules = select message, notify rule

プレフィックスadmin_および.msg拡張子がDr.Web Notifierによって自動的に挿入されます。

tempfail - 一時的なサーバーの失敗を送信者に報告します。
redirect - メッセージを指定したアドレスに転送します。
quarantine - メッセージを隔離に送ります。

stopコマンドはルールの処理を中断します。アクションは既に処理されているルール(pass、accept、rejectなど)、また最後に実行されたコマンドに応じて適用されます。

acceptpass + stopとほとんど同じです。ただしacceptはローカルルールでは処理を中断し、グローバルルールではpassと同じになります。

passdiscardおよびtempfailよりも優先されます。ただしrejectは最優先され、メッセージの処理を中止し、以後の全てのアクションは実行されません(notifyを除く)。

これらのコマンドは、通知に挿入する追加のテキストフィールドで補完する必要があります。

各メールメッセージは、MIMEオブジェクト、そのヘッダと内容、マルチパートメッセージ内に添付されたMIMEオブジェクトから成っています。それぞれのパートに対して、削除、署名追加、テキストの置き換えや変更などの異なるアクションを実行することが出来ます。他の種類の全てのルールが別々のエレメント、またはエレメントのセットに適用されます。

各コマンドの前にselect、or、and、nand、norのインストラクションの内の1つを指定する必要があります。各コマンドの後には選択のパラメータを指定します。

2つ目は別々のエレメントに適用されるルールです。

select message

メッセージのルートMIMEエレメントを選択します。

select mime(headers), select mime.headers

select mime(prologue), select mime.prologue

select mime(body), select mime.body

select mime(epilogue), select mime.epilogue

これらのコマンドで様々なMIMEオブジェクトを選択します。括弧のあるコマンドは指定されたエレメントを含んだMIMEオブジェクトを選択しますが、ドットのあるコマンドはエレメントそのものを選択します。

:

select mime(headers) Content-type "x-video"

remove

このコマンドはメッセージから全てのvideoエレメントを削除します。

select mime.headers Content-type "x-video"

remove

このコマンドは全てのvideoエレメントからデータタイプに関する情報を削除します。複合MIMEパートを選択できるのは、それがメッセージそのものである場合のみです。

select mime(headers) header_name regular_expression_to_match_header_body

select mime(prologue) regular_expression

select mime(body) regular_expression

select mime(epilogue) regular_expression

これらのコマンドは、指定したテンプレートに一致するテキストを持ったエレメントを選択します。

select sender <regular_expression>

select recipient <regular_expression>

これらのコマンドは、受信者と送信者に関する情報を持ったエントリを選択します。この情報はエンベロープからとられます。必要な記号のシーケンスが見つかった場合、select senderおよびselect receiverコマンドがselect messageコマンドとして処理されます。

例:

以下のコマンドを使用して、管理者に対するメッセージの最後にグリーティングを追加することが出来ます。

select recipient "root@localhost", append_text "hello, root"

複数の条件によってエレメントを選択する必要がある場合、該当する論理演算子を使用してルールを組み合わせることが出来ます。

and - 指定されたルールに一致するアイテムのみを選択内に残します。
nand - 指定されたルールに一致しないアイテムのみを選択内に残します。
or - 指定されたルールに一致するアイテムのみを選択に追加します。
nor - 指定されたルールに一致しないアイテムのみを選択に追加します。

これらの演算子はマルチパートMIMEのオブジェクトの選択にのみ使用することができ、そのようなオブジェクトの別々のパートには使用できないので注意してください。

html中に"<script"という文字列があるMIMEパートを選択:

select mime(headers) Content-type html

and mime(body) "\<script"

2つの別々のルールが順番に適用されます。1つ目でContent-typeヘッダ内の全てのhtmlエレメントを選択し、2つ目でそのエレメントの中から"<script"記号のセットを持つものが選択されます(大文字小文字は無視されます)。

 

warning

"<"記号の前のバックスラッシュは"<script"を算術値ではなくストリングとして扱うことを意味するものです。

 

例:

select mime(headers) Content-type html

nand mime(body) "\<script"

最初の条件によってContent-typeヘッダ内の全てのhtmlエレメントが選択されます。2つ目の条件によって"<script"という文字列を持つエレメントがそこから除外されます。

例:

select mime(headers) Content-type html

or mime(body) "\<script"

最初の条件によってContent-typeヘッダ内の全てのhtmlエレメントが選択されます。2つ目の条件によって"<script"という文字列を持つエレメントが選択に加えられます。

例:

select mime(headers) Content-type html

nor mime(body) "\<script"

最初の条件によってContent-typeヘッダ内の全てのhtmlエレメントが選択されます。2つ目の条件によって"<script"という文字列を持たないエレメントが選択に加えられます。

後続のルールの前にselectを指定すると、前回の選択が解除されます。

:

select mime(headers) Content-type html

select mime(body) "\<script"

最初の条件によってContent-typeヘッダ内の全てのhtmlエレメントが選択されます。2つ目の条件によって最初の選択が解除され、"<script"という文字列を含むエレメントのみが選択されます。

演算子が指定されていない場合、後続のルールは全て無視され選択には変更が加わりません。

:

select mime(headers) Content-type html

mime(body) "\<script"

選択は最初の条件でのみ行われ、Content-typeヘッダ内のhtmlエレメントのみが選択されます。

Modifierプラグインとvaderetroプラグインに互換性を持たせるには、メッセージヘッダ内の検索に比較命令">n"および"<n"を使用してください。ヘッダが整数を含み(例:X-Drweb-SpamScore "30")、あるルールに一致する(例:select mime(headers) X-Drweb-SpamScore "<50")場合、そのヘッダにModifierルールを適用することが出来ます。

この場合は、select mime(headers) X-Drweb-SpamScore "\<50"ルールでもX-Drweb-SpamScore "<50"ヘッダのエレメントが選択されるので、"<"記号の前にバックスラッシュは必要ありません。

select_mimesコマンドを使用して、MIMEオブジェクトをそのヘッダによって選択することが出来ます。ヘッダとオブジェクトを同じ条件で選択する必要がある場合に、これによってプラグインの動作を早めることが出来ます。オブジェクト全体を選択したい場合は、そのオブジェクトからエレメントを1つだけ選択してください。

3つ目は選択したエレメントを変更するためのルールです。

このルールはMIMEオブジェクトの内容にのみ適用されます。

replace expression_for_replacement regular_expression_to_be_replaced

replace_all new_text

これらのコマンドは、テキストを他のテキストと置き換えます。

例:

添付されているファイルの拡張子をリネームします。

select mime.headers Content-disposition "filename=.*\\.exe",\

or mime.headers Content-type "name=.*\\.exe",\

replace "\\.ex_" "\\.exe",\

pass

これらのコマンドはマルチパートメッセージのパートには使えません。つまり、2つのサブオブジェクトを持ったマルチパートMIMEオブジェクトから成るメッセージに対しては

    select message

    replace_all «text»

というコマンドは有効ではありません。マルチパートオブジェクト自体は他のオブジェクトのコンテナであり、データを含まないからです。

replaceおよびreplace_allコマンドに対しては、関数呼び出しをexpression_for_replacementおよびnew_textとして使用することが可能です。それらは${func_name}として指定することが出来ます。関数の引数は現在のregular_expression_to_be_replacedです。

以下の関数に対応しています。

olc - 小文字に切り換えます。
ouc - 大文字に切り換えます。
ourlencode - 引数をURLとして使用できる文字列にエンコードします。
oself - 正規表現を変更せずに返します。

:

select mime.headers "Subject" "^.*$", replace_all "old:${self} new:${lc}"

指定されたパターンに一致するメッセージのSubjectヘッダ(例:"This is Subj")を"old:This is Subj new:this is subj"で置き換えます。

:

select mime.body ".*", replace "Upper:${uc}" "http://\\S+"

指定されたパターンに一致する、メッセージ本文からのいくつかのテキスト(例:"Text1 http://vasya.pup.kin Text2")を"Text1 Upper:HTTP://VASYA.PUP.KIN Text2"で置き換えます。

:

select mime.body ".*", replace "http://check-url.com?url=${urlencode}" "http://\\S+"

指定されたパターンに一致する、メッセージ本文からのいくつかのテキスト(例:"Visit http://vasya.com?id=3")を"Visit http://check-url.com?url=http%3A%2F%2Fvasya%2Ecom%3Fid%3D3"で置き換えます。

remove

このコマンドは、ルートMIMEオブジェクト以外の全ての種類の選択されたオブジェクトを削除します。

例:

removeコマンドは以下のようなルール内では使用できません。

GlobalRules = select mime(body) "text", remove, pass

GlobalRules = select mime(body) "script", remove, pass

prepend_text

append_text

prepend_html

append_html

これらのコマンドは、選択したMIMEオブジェクトにプレーンテキストかhtmlを加えます。

例:

select message

append_html "<h1>checked by anti-spam</h1>" [[7b:]encoding]

これらのコマンドは、オプションのパラメータencodingによってセットされたエンコーディング、およびプレフィックス"7b:"によってセットされた7-bit context transferエンコーディングでメッセージに署名を付けます。

ある特定のエンコーディングにテキストを挿入する必要がある場合、言語ファイル(.lng拡張子)をソースとして使用することが出来ます。.lngファイルから必要な文字列を選択するには$1, $2 ... $nパラメータを使用してください。n.lngファイル内の文字列の番号です。

例:

.lng ファイルが以下のような場合、

1 = string1

2 = some other string

...

append_text $2append_text "some other string" コマンドと同じになります。

値そのものか「ファイル」タイプのルックアップのみ使用できるLookupsLiteタイプの値を介してルックアップを使用することも可能です。

例:

append_text "lookup:file:path_to_file"

以下のコマンドでヘッダをメッセージに追加することが出来ます。

select message, addheader "foo:bar"

このコマンドは、fooという名前でbarという値のヘッダを、選択したメッセージエレメントに追加します。ヘッダの名前と値はコロンで区切って列挙します。

4つ目はif/else構造を作成するためのルールです。

goto - 無条件に転送
goto(y) - エレメントが少なくとも1つ選択されている場合、無条件に転送
goto(n) - エレメントが選択されていない場合、無条件に転送

パラメータ値に正の整数を使用することができ、一度にいくつのルールをスキップする必要があるかを指定します。

例:

実行ファイルが添付されたメッセージを全て拒否したい場合、以下のコマンドを使用してください。

mime(header) Content-type "executable"

goto(n) 1

reject

上記のコードは以下のように実行されます。

selection=find(mimes with content type "*executable*")

if(selection){

   reject mail;

}

if [not] found .... else .... endifコマンドを使用することも可能です。

例:

select mime.headers "X-DrWeb-SpamState" "yes",\

if found,\

select mime(headers) Content-type "image",\

remove,\

endif,\

上記のコマンドによって、Vaderetroプラグインがスパムと判定したメッセージから全ての画像を削除することが出来ます。

正規表現内で引用符を使用する場合、複数の"\"記号でそれらをエスケープする必要があります。現在のバージョンでは、引用符のエスケープに"\"記号が6個必要です。

:

GlobalRules = select mime.headers Subject ".*\\\\\\"", if found, reject, endif

また、各メッセージのスコアをチェックすることも出来ます。処理の始めにメッセージに割り当てられる最初のスコアは0になります。if score、add_score、set_scoreコマンドを使用して、プラグインが処理の間にこのスコアをチェック、変更することが出来ます。"if score"は"if found"コマンドと同じ働きをしますが、チェックするのはメッセージスコアのみです(それより前の"select"コマンドの結果は無視します)。

:

....

if found,\

  set_score 10,\

endif,\

メッセージに新しいスコア10を設定します(それが条件に抵触しない場合)。

:

....

add_score 11,\

メッセージのスコアに11加えます。

:

....

if score >100,\

  reject,\

else,\

  add_score -5,\

endif

メッセージスコアが100よりも大きい場合、このメッセージは拒否されます。それ以外の場合、スコアから5を引きます。

if score 引数は空白無しの1つの文字列として指定し(例えば< 100ではなく<100)、比較演算子および整数の引数を含んでいる必要があります。

以下の比較演算子を使用することが出来ます。

if score <2  - スコアが2より小さい場合
if score >5  - スコアが5より大きい場合
if score =8  - スコアが8の場合

整数の引数は、-20億~+20億の間の32bit整数です。メッセージの処理中にスコアがオーバーフローする場合があり、それにより他のモジュールが正しく動作しなくなることがあります。そのため、ルール内で無意味に大きいスコア値を使用することは推奨できません(例えばadd_scoreパラメータに2000000000を指定するなど)。

選択したMIMEオブジェクトにテキストを加えた後、選択は破棄されます。

Table_Modifier

表1.オブジェクト選択肢と実行可能な処理(コマンド)

* mime.bodyの場合と同じ
+ 利用可能
- 利用不可

:

- 複数の条件によってエレメントを選択する

GlobalRules = select mime(headers) Content-type "text", and mime(body) "typical spam",\

- そのようなエレメントが見つかったら、メッセージを破棄する

goto(n) 1,\

discard,\

- それ以外の場合、実行ファイルを全て選択しそれらを削除する

select mime(headers) Content-disposition ".exe",\

remove,\

- メッセージ本文に署名を追加する

select message, append_text "checked!"

goto(n) 1,\およびdiscard,\の後ろに空白を置くと、ルールが実行されないので注意してください。

メッセージにhtmlファイルを追加する

GlobalRules = select message, append_html "lookup:file:/maild-files/somehtml.html"

選択したユーザからのメッセージを削除する

GlobalRules = select mime(headers) From "weirdohacker@server.net", if found, reject, endif

メッセージを転送する

GlobalRules = select mime.headers To "someaddress@my-net.com", replace_all "anotheraddress@my-net.com"

この例では、元のメッセージはsomeaddress@my-net.comに送信され、そのコピーがanotheraddress@my-net.comに送信されます。

メッセージを元の受信者に送信したくない場合は以下のルールを使用してください。

- 特定の条件によってメッセージを選択する

GlobalRules = select mime.headers Subject "Help",\

if found,\

select mime.headers To "someaddress@my-net.com",\

if found,\

- 選択したメッセージを特定のアドレスに転送する

redirect "anotheraddress@my-net.com",\

- 選択したメッセージが誤って元の受信者に送信されないよう、そのメッセージを削除する

discard,\

endif,\

stop,\

endif,\

メッセージを件名に応じて転送する

GlobalRules = \

- サポート部門へのメッセージをチェックする

select mime.headers Subject "support|bugreport[s]|help",\

if found,\

- テンプレートが見つからない場合、以下のコマンドが渡されます

select mime.headers To "@company.com", \

if found,\

redirect "support@company.com",\

endif,\

pass, \

endif,\

- クライアントがオーダーを望んだ場合、以下のコマンドが実行されます

select mime.headers Subject "price|buy|order",\

if found,\

select mime.headers To "@company.com", \

if found,\

redirect "sell@company.com",\

endif,\

pass, \

endif,\

- その他のトピック

select mime.headers To "@company.com", \

redirect "inbox@company.com",\

pass

添付された実行ファイルを検索してそれらをリネームする

select mime.headers Content-disposition "filename=.*\\.exe", or mime.headers Content-type "name=.*\\.exe",\

replace "\\.ex_" "\\.exe",\

pass