Sieveスクリプトの作成

Sieve ScriptsSecurityGateway Sieve拡張 ページに加え、このページではSieveメールフィルタリング言語とSecurityGateway上での実装に関する概要を説明します。最初にSieveスクリプトの基本を説明します。次にこの言語の様々な構成エレメントについて説明します。対応している、標準的なコントロール, テスト, アクション コマンド一覧も紹介します。最後に、ページの下部にサンプルスクリプトを紹介しているので、ご参照下さい。

Sieveメールフィルタリング言語に関する詳細な情報については、IETFウェブサイトでドキュメントを参照してください: Sieve: An Email Filtering Language (RFC-5228), Sieve's Copy Extension (RFC 3894), Sieve's Body Extension (RFC-5173), Sieve's Reject Extension (RFC-5429), Sieve's Variables Extension (RFC-5229), Spamtest and VirusTest Extensions (RFC-3685)

SecurityGatewayの電話やメールサポート、ナレッジベース、FAQ、フォーラム等の技術サポートやヘルプ情報については www.mdaemon.com/Support/ を参照してください。

Sieveスクリプトの要素

Sieveスクリプトは、基本的には次の4つの要素で構成されています。

1.Requirements(要件)—この要素は、提供されたスクリプトに必要とされるSieve拡張を宣言するために使用されます。オプションの拡張に属しているコマンドがスクリプトで使用される場合、スクリプトの始めで必要な拡張を一覧にするrequireコントロールコマンドを使用する必要があります。セミコロンはrequireコマンドの引数の終わりで必要です。

例:

require "SecurityGateway";

-and-

require ["SecurityGateway", "fileinto"];

2.Conditions(条件)—スクリプトのこの要素は、メッセージ中でテストする任意のタイプと、テストや比較の方法を宣言するのに使用します。

例:

if size :over 1M

-and-

if header :contains ["to", "cc"] "Frank Thomas"

3.アクション—これらは、必要とされる処置および指定された条件がTrueである場合、実行されるコマンドです。各Actionは、セミコロンが必要で、処置の各ブロックは、波括弧"{"および"}"を含む必要があります。

例:

if size :over 1M { discard; }

-and-

if header :contains ["to", "cc"] "Frank Thomas" {

bayes-learn "spam";

fileinto "spam";

}

4.コメント—自分自身の参照のためにコメントをSieveスクリプトに含むことができます。使用することができる2種類のコメント、1行コメントおよび複数行コメントがあります。1行コメントは"#"から始めて、行の終わり(すなわち次のCRLF)まで継続します。複数行コメントは"/*"から始めて、複数の行にすることができ、"*/"で終わります。

例:

# discards messages over 1 mb

if size :over 1M { discard; }

-and-

if header :contains "from" "Frank Thomas" {

/* Frank Thomas sends mostly spam to us, so this script

will automatically move everything we get from him to

the user quarantine. */

fileinto "spam";

}

構成要素

文字列

テキスト文字列は1つダブルクォートで始めと終わりにおきます。例えば: "Frank Thomas"。

バックスラッシュまたはダブルクォート引用符で囲まれた文字列内の文字にバックスラッシュまたはダブルクォートを含むには、もう一つバックスラッシュの後に存在する必要があります。従って、\\は\と\"として処理され、引用符で囲まれた文字列において"とみなされます。他の文字は文字列でエスケープキャラクタにはなりません。

文字列のリスト

スクリプトでグループの文字列を使用する場合、各引用符で囲まれた文字列をカンマで区切って、セットを角括弧に入れます。

:

if header :contains ["to", "cc"] ["me@xyz.com", "you@xyz.com", "us@xyz.com"]

ToまたはCCヘッダが3つのアドレスのうち、いずれかを含んでいる場合、このテストの結果はTrueです。

ヘッダ

ヘッダ名でコロンは不要です。

:

if header :is "to:" (invalid)

if header :is "to" (valid)

テストリスト

文字列リストと同様に、グループを括弧に入れることによって、スクリプトで一群のテストを含むことができます。これは、それぞれ論理的な"AND"および"OR"ステートメントなので、全部または任意のTestコマンドを使用する時に必要です。

:

if anyof (size :over 1M, header :contains "subject" ["big file", "mega file"])

{

discard;

}

引数と比較タイプ

大部分のコマンドは、実行する内容について指定するために、一つ以上引数を必要とします。いくつかのタイプの引数(例えば位置引数、タグを付けられた引数およびオプションの引数)があります。タグを付けられた引数およびMatch Type引数、コロンで先行されます。:contains、:is、:matches:overおよび:underは、タグを付けられた引数のすべてのサンプルです。一部のタグを付けられた引数は、特定のコマンドに限られています。異なるタイプの引数の詳細について、以下を参照:RFC-5228

アクション

各処置は、セミコロンで区切る必要があり、そして、処置の各ブロックは、波括弧で囲む必要があります。

:

if header :contains ["to", "cc"] "Frank Thomas" {

bayes-learn "spam";

fileinto "spam";

}

コントロールコマンド

Sieve言語で使用される3つのコントロールコマンドがあります。

require

このコントロールコマンドは、どのオプションの拡張をスクリプトで使用するか宣言するためにスクリプトの始めに使用されます。

例:

require ["SecurityGateway", "fileinto"];

if / elsif / else

if コマンドは、中心的なコントロールコマンドです。3つの相互関係あるコマンドが技術的にありますが、elsifおよびelseは、 if で独立して使用することができません。 if がスクリプトで遭遇される時に、テスト条件はTrueであるか判定するために評価されます。Trueの場合、関連する処置が実行されます。

if テストがfalseである場合、最初の elsif テストが評価されます。 elsif がtrueである場合、そのテストと関連する処置が実行されます。 elsif テストがfalseと判明する場合、続いて、それらの1つがtrueになるまで、処理は次のelsifに続きます。

ifおよびすべての elsif テストがfalseである場合、elseコマンドがある場合、そのコマンドの処置は実行されます。

stop

stopコントロールコマンドは、すべての処理を終わらせます。

 

テストコマンド

これらは、SieveのSecurityGatewayの実装でサポートされる標準テストコマンドです。bodyおよびenvelopeコマンドは拡張です。しかしスクリプトで、Testコマンドのいずれかを使用する場合には、requireコントロールコマンドで、これらを含む必要があります。さらに、SecurityGateway Sieve拡張ページで要点をまとめられるSecurityGateway拡張に含まれる追加されたテストコマンドがあります。

address

このコマンドで、含んでいる可能性のあるフレーズまたは名前ではなくヘッダでメールアドレスのみテストすることができます。例えば、"to"ヘッダで"Frank Thomas" <frank@example.com>を含む場合、テストヘッダ:is "to" "frank@example.com"の結果はfalseになります。しかし。アドレスだけが評価されるので、テストアドレス:is "to" "frank@example.com"はtrueになります。

同様に、このコマンドで使用できるオプションのタグを付けられた引数":localpart", ":domain"および":all"があります。:localpart引数は、アドレス(例えば"frank@example.com"の"frank")の左辺だけを評価します、:domain引数は、アドレス(例えば"example.com")のドメイン一部を使用するだけです、:allは全アドレスを使用します。これらの引数のいずれも含まれない場合、:allはデフォルトにより使用されます。

:

require "fileinto";

if address :domain :is "from" "spammer.com" {

fileinto "spam";

}

allof

このテストは、論理的な"AND"で、処置のために評価される条件の全てがtrueである必要があります。

:

if allof (header :contains "from" "J.Lovell", header :contains "to" "Bubba")

{

fileinto "spam";

}

anyof

このテストは、論理的な"OR"で関連する処置のために評価される条件のいずれかがtrueである必要があります。

:

if anyof (size :over 1M, header :contains "subject" "big file attached")

{

reject "I don't want messages that claim to have big files.";

}

body

bodyテストコマンドは、オプションの拡張で、使用する任意のスクリプトの始めに、require "body"コントロールコマンドを使用する必要があります。このコマンドは、メッセージの本文に対して比較します。このコマンドの詳細は、以下を参照してください:Sieve's Body Extension (RFC-5173)

:

require ["body", "fileinto"];

if body :text :contains "secret formula" {

fileinto "admin";

}

envelope

envelopeコマンドは、オプションの拡張で、使用する任意のスクリプトの始めに、require "envelope"コントロールコマンドを使用する必要があります。"from"またはto"がコマンドの引数として個々に使用される場合、このコマンドはSMTP MAIL FromおよびRCPT To envelopeパートに対して比較します。

require "envelope";

if envelope :is "from" "MrsFrank@company.com" {

redirect "frankshome@example.com";

}

exists

引数にリストされるヘッダがメッセージ内で存在する場合、このテストはtrueです。すべてのリストされたヘッダが存在する必要がありか、またはテストがfalseである必要があります。

:

if exists "x-custom-header" {

redirect "admin@example.com";

}

-and-

if not exists ["from", "date"] {

discard;

}

false

このテストは、"FALSE"に常に評価します。

header

指定されたヘッダの値が引数によって設定される条件に適合させる場合、ヘッダテストはtrueに評価します。Match Type引数なしが指定される場合、:isはデフォルトにより使用されます。

:

require "fileinto"

if header :is "x-custom-header" "01" {

fileinto "admin";

}

not

別のテストで、このコマンドの使用は、テストの結果が、テストの処置が必要とされる逆転することを意味します。例えば、テストif not exists ["from", "date"] { discard; }は、メッセージが"from"および"date"ヘッダ両方を含んでいない場合、discard処置が必要とされることを意味します。notコマンドが省略される場合、それはヘッダDIDが存在する場合、メッセージが廃棄されることを意味します。

size

sizeコマンドはタグを付けられた引数":over"および":under"を受け入れ数値によって適用される必要があります。これらの引数は、メッセージサイズが、テストでTRUEとなるよう指定される値より高いまたは低いか指定するために用います。メガバイトを示す値の後のM、キロバイトのK、またはバイトには文字を指定なしで使用することができます。

:

if size :over 500K {

discard;

}

true

このテストは、"TRUE"に常に評価します。

spamtest

spamtest コマンドは、ietf.orgのSpamtest and VirusTest Extensions (RFC-3685)ドキュメントで定義されているSieve拡張です。この拡張に関する情報についてはそのドキュメントを参照してください。

virustest

virustestコマンドは、ietf.orgのSpamtest and VirusTest Extensions (RFC-3685)ドキュメントで定義されているSieve拡張です。この拡張に関する情報についてはそのドキュメントを参照してください。

アクションコマンド

これらの標準アクションコマンドは、SecurityGatewayによってサポートされます。fileintoおよびrejectコマンドは拡張で、従って、スクリプトで、どちらかのコマンドを使用する場合には、require controlコマンドで、これらを持つ必要があります。SecurityGateway Sieve拡張ページで概説されるSecurityGateway拡張を通して利用可能な多くのその他actionコマンドがあります。

fileinto

fileintoアクションコマンドはオプションの拡張で、使用する任意のスクリプトの始めに、require "fileinto"コントロールコマンドを使用する必要があります。このコマンドは、2つの引数"spam"および"admin"を受け入れます。"spam"はメッセージをユーザー隔離 へ、"admin"は管理隔離へ移動します。

:

require "fileinto";

if header :contains "from" "Frank Thomas" {

fileinto "spam";

}

discard

この処置は、配信に状況通知を送信することなく確認なしでメッセージ削除します。

:

if size :over 2M { discard; }

keep

この処置は、デフォルトロケーションにメッセージを保存します。

redirect

メッセージの本文または既存のヘッダを変更することなく、このコマンドは、メッセージを関連した引数で指定されているアドレスにリダイレクトします。このコマンド同じくはオプションの:copy拡張をサポートし、メッセージをリダイレクトするのではなく、指定されたアドレスにメッセージのコピーを送信します。これは、指定アドレスにコピーの送信と、その他の処置の実行を可能にします。

:

require "copy";

if header :contains "subject" "Response to XYZ" {

redirect :copy "offers@example.com";

bayes-learn "ham";

}

reject

rejectアクションコマンドはオプションの拡張で使用する任意のスクリプトの始めにrequire "reject"コントロールコマンドを使用する必要があります。このコマンドは5xx応答コードでSMTP処理中にメッセージを拒否し引数で指定されている任意の短いメッセージを送信します。

require "reject";

if size :over 5M {

reject "No way! This message is too big for me to accept.";

}

サンプルSieveスクリプト

 

"[SPAM]"を件名に含んでいるメッセージを拒否

require "reject";

if header :contains "subject" "[SPAM]"

{

reject "I don't want your spam";

}

特定のリアルネーム宛のメールを拒否

require ["SecurityGateway","reject"];

if header :contains "to" "Real Name"

{

bayes-learn "spam";

reject "I don't want your spam";

}

カスタムベイジアン自動学習

require ["SecurityGateway","comparator-i;ascii-numeric"];

if whitelisted

{

bayes-learn "ham";

}

elsif anyof(blacklisted,spamtotal :value "gt" :comparator "i;ascii-numeric" "20.0")

{

bayes-learn "spam";

}

クレーリストDNSBLの一致

require "SecurityGateway"];

if not lookup "rblip" "all" {greylist;}

サイズの大きいメール受信時管理者に通知

require ["SecurityGateway"];

if size :over 1M

{

alert text:

To: admin@company.mail

From: postmaster@$RECIPIENTDOMAIN$

Subject: SecurityGateway Content-Filter Message

X-Attach-Msg: No

$RECIPIENT$ received a message larger that 1MB.

.

;

}