まとまった資料がないので、自分が必要な分だけまとめておく。
sieveについて
sieveとは
sieveとは、メールフィルターを定義するための言語。sieveそのものは、RFCで定義されている。
規格
- RFC 5228 – Sieve: An Email Filtering Language (言語仕様)
- RFC 5183 – Sieve Email Filtering: Environment Extension (envonment)
- RFC 5229 – Sieve Email Filtering: Variables Extension (variables)
- RFC 5230 – Sieve Email Filtering: Vacation Extension (vacation)
- RFC 5232 – Sieve Email Filtering: Imap4flags Extension (imap4flags)
- RFC 5233 – Sieve Email Filtering: Subaddress Extension (subaddress)
- RFC 5260 – Sieve Email Filtering: Date and Index Extensions (date/index)
- RFC 5435 – Sieve Email Filtering: Extension for Notifications (enotify)
- RFC 5173 – Sieve Email Filtering: Body Extension (body)
基本的な書き方
基本的な構文
sieveの文には、次の三種類がある。
最もシンプルなのは、アクション文。セミコロンで終了する。
制御文は、セミコロンの代わりにブロックで終了する。
条件文は、制御文の一部を構成する。
コメント
コメントには、二種類の書き方がある。
#
から行末まで/*
と*/
で囲んだ部分。改行を含めることができる
#
の使用例。
if size :over 100k { # この部分はコメント
discard;
}
/*
と */
の使用例。
if size :over 100K { /* この部分はコメント
この部分もまだコメント */ discard /* この部分もコメント
*/ ;
}
数字
数字は正の整数のみ使用できる。
単位の大きい数字を記述するために、K
、M
、G
が使用可。
1K
は1024
と同じ1M
は1024K
と同じ1G
は1024M
と同じ
文字列
文字列は、ダブルクォーテーションで囲う。
文字列リスト
[
と ]
で囲み、文字列をリスト化することができる。
たとえば次の例では、To
または Cc
に me@example.com
または me00@landru.example.com
が含まれている場合にtrueとなる。
header :contains ["To", "Cc"]
["me@example.com", "me00@landru.example.com"]
メールヘッダ
ヘッダ要素はコロンなしで指定する。
From: を指定する場合には "From"
とする。"From:"
とするとマッチしなくなるので注意。
メールアドレス
メールアドレスは、次のいずれかの形式で指定できる。
- メールアドレスそのもの
- 「テキスト “<” メールアドレス “>”」の形式
比較型 (MATCH-TYPE)
書式でMATCH-TYPEと指定されている部分には、次のいずれかを使用できる。
:contains
– 部分一致:is
– 完全一致:matches
– ワイルドカード比較 (*
と?
が利用可):regexp
– 正規表現
:matches
では、 *
は任意の文字列、?
は任意の一文字にマッチする。テキスト中で ? や * をワイルドカードとしてではなく文字そのものとして使用したい場合には、"\\*"
や "\\?"
のようにエスケープする必要がある。
正規表現を使用する場合には、require
でregexp
を宣言する必要あり。
コンパレータ (COMPARATOR)
書式でCOMPARATORと指定されている部分には、コンパレータ名を指定することができる。コンパレータ名は、RFC4790 – Internet Application Protocol Collation Registry で定義されている。"i;octet"
や "i;ascii-casemap"
がある。
何も指定しない場合のデフォルトは、"i;ascii-casemap"
。
使用例。
if header :contains :comparator "i;octet" "Subject"
"MAKE MONEY FAST" {
discard;
}
個人的には利用することがなかったので、詳細は省略。
サブアドレス
メールサーバの設定によっては、Gmailのようにメールアドレスのユーザ名の部分に、デリミタ文字+文字列を追加して拡張可能なことがある。デリミタ文字には、Gmailでは+
が使われている。
たとえばken@example.com
というアドレスに+mta-filters
を追加し、ken+mta-filters@example.com
とすることができる。どちらもメールサーバは同じアドレスとみなす。
:user
– デリミタの前の部分:detail
– デリミタの後ろの部分
使用例。
require ["envelope", "subaddress", "fileinto"];
# この例では、"ken@example.com" および "postmaster@example.com"
# 宛てのメールは同じアカウントで受信する
# postmaster宛てのメールはすべてひとつのメールボックスに保存。
# :detail部分は無視する。
if envelope :user "to" "postmaster" {
fileinto "inbox.postmaster";
stop;
}
# メーリングリストのメールを保存 ("ken+mta-filters" として登録)
if envelope :detail "to" "mta-filters" {
fileinto "inbox.ietf-mta-filters";
}
# "ken+foo" 宛てのメールはすべて転送
if envelope :detail "to" "foo" {
redirect "ken@example.net";
}
アドレス比較 (ADDRESS-PART)
書式でADDRESS-PARTと指定されている部分には、メールアドレスのパーツを指定することができる。ただし、Cyrus Sieveではサポートしていない。Dovecotでは使える。
:local-part
– @の左側:domain-part
– @の右側:all
– 全体
指定しない場合のデフォルトは :all
。
さらに:local-partを :user
"+"
:detail
の形に分解して指定することも可能。ただしこれも、Cyrus Sieveではサポートしていない。Dovecotでは使える。
:user
や:detail
を使用するには、require
でsubaddress
を宣言する必要あり。
変数
sieveの中で、変数を扱うことができる。変数を利用するには、require
でvariables
を宣言する必要あり。
変数名がvar
のとき、変数は${var}
と記述する。変数にはmatch変数と、任意の名前をつけた変数の2種類がある。
match変数は、条件式で:matches
を使用したときに、マッチしたものに自動的に割り当てられる。
実行例。
require ["fileinto", "variables"];
if header :matches "List-ID" "*<*@*" {
fileinto "INBOX.lists.${2}"; stop;
}
# 次のヘッダを持つ場合の例
# Subject: [acme-users] [fwd] 第1版リリース
if header :matches "Subject" "[*] *" {
# ${1} は "acme-users"
# ${2} は "[fwd] 第1版リリース" となる
fileinfo "INBOX.lists.${1}"; stop;
}
# 次のヘッダを持つ場合の例
# To: coyote@ACME.Example.COM
if address :matches ["To", "Cc"] ["coyote@**.com",
"wile@**.com"] {
# ${0} はマッチしたアドレス
# ${1} は常に空の文字列
# ${2} はドメイン名 ("ACME.Example")
fileinto "INBOX.business.${2}"; stop;
} else {
# いずれかがマッチした場合、このブロックは実行されない。
# つまり、このブロック内では何も変数が設定されない。
}
if anyof (true, address :domain :matches "To" "*.com") {
# 2番目のテストが実行されることがないため、やはりこの
# ブロック内でも変数は何も設定されない。
stop;
}
任意の名前で変数を設定するには、set
アクションを使用する。
制御文
require
RFCで拡張機能とされているものを使用する場合には、機能を使用する前にrequire文を使って宣言する必要がある。
ひとつずつ宣言してもよい。
require "fileinto";
require "vacation";
まとめて宣言する事もできる。
require ["fileinto", "reject"];
if
if文は、if
、elif
、および else
で構成される。
if
– 条件文。elif
– ifに続けて指定する条件文。複数指定可。else
– if または elif に続く。
使用例。
if header :contains ["From"] ["coyote"] {
redirect "acm@example.com";
} elsif header :contains "Subject" "$$$" {
redirect "postmaster@example.com";
} else {
redirect "field@example.com";
}
stop
スクリプトを終了。
アクション文
addflag
メールにフラグをセットする。既存のフラグを上書きしない。つまりaddflag
を何度も使うと、その都度フラグが増えていく。require
でimap4flags
を宣言する必要あり。
書式は次のとおり。
addflag [<variablename: string>]
<list-of-flags: string-list>
使用例。
addflag "flagvar" "\\Deleted";
addflag "flagvar" "\\Answered";
上の例は、以下に示す3種類の書き方と同じ動作をする。
addflag "flagvar" ["\\Deleted", "\\Answered"];
addflag "flagvar" "\\Deleted \\Answered";
addflag "flagvar" "\\Answered \\Deleted";
addheader
メールヘッダを追加する。require
でeditheader
を宣言する必要あり。
書式は次のとおり。
addheader [":last"] <field-name: string> <value: string>
使用できるキーワードには、次のものがある。
:last
– ヘッダの最後に追加
次の例では、メールヘッダにより転送済みかどうか判断して、未転送なら転送する。
/* すでに転送済みなら転送しない */
if not header :contains "X-Sieve-Filtered"
["<kim@job.example.com>", "<kim@home.example.com>"]
{
addheader "X-Sieve-Filtered" "<kim@job.example.com>";
redirect "kim@home.example.com";
}
debug_log
デバッグ用のログを出力する。Dovecot独自の拡張。使用するには、require
でvnd.dovecot.debug
を宣言する必要あり。
書式は次のとおり。
debug_log <message: string>
ただし、Roundcubeではベンダーの独自拡張をサポートしていない。
deleteheader
メールヘッダを削除する。require
でeditheader
を宣言する必要あり。
書式は次のとおり。
deleteheader [":index" <fieldno: number> [":last"]]
[COMPARATOR] [MATCH-TYPE]
<field-name: string>
[<value-patterns: string-list>]
使用できるキーワードには、次のものがある。
:index
– 削除するヘッダフィールドの位置:last
– 位置を後ろからカウント
次の例では、Delivered-To
にbob@example.com
が含まれていた場合に、最初のヘッダフィールドを削除する。
deleteheader :index 1 :contains "Delivered-To"
"bob@example.com";
discard
破棄。
利用例。
if header :contains ["from"] ["idiot@example.com"] {
discard;
}
error
ランタイムエラーとしてsieveスクリプトの実行を中止する。使用するにはrequire
でihave
を宣言する必要あり。
書式は次のとおり。
error <message: string>
指定されたエラーメッセージは、エラーログに残される。
fileinto
フォルダを指定して保存。require
でfileinto
を宣言する必要あり。
fileinto [:specialuse <special-use-attr: string>]
[:copy] [:create] <mailbox: string>
使用できるキーワードは、次のとおり。
:specialuse
– 特別なフォルダーの指定:create
– 存在しなければフォルダを作成:copy
– コピーをフォルダに入れる
:specialuse
を使う場合、require
でspecial-use
を宣言する必要あり。「特別なフォルダー」には、次の者がある。
\All
– すべてのメッセージ\Archive
– アーカイブ\Drafts
– 下書き\Flagged
– マーク済み\Junk
– 迷惑メール\Sent
– 送信済み\Trash
– ごみ箱
:create
を使用する場合、require
でmailbox
を宣言する必要あり。
:copy
を使用する場合、require
でcopy
を宣言する必要あり。
次の例では、From
ヘッダにcoyoteという文字列が含まれていたら、INBOX.harassment
に保存する。
require "fileinto";
if header :contains ["from"] "coyote" {
fileinto "INBOX.harassment";
}
:specialuse
の使用例。特別なフォルダー\Archive
がなければ、Inbox/Archive
に保存する。
require "fileinto";
require "special-use";
fileinto :specialuse "\\Archive" "INBOX/Archive";
:create
の使用例。特別なフォルダー\Junk
もSpam
も存在しないとき、Spam
フォルダを作成してメール保存する。
require "fileinto";
require "special-use";
require "mailbox";
fileinto :specialuse "\\Junk" :create "Spam";
Cyrus IMAPのsieveでは、フォルダー名に日本語が含まれている場合、日本語のままだと解釈されない。
Thunderbirdの場合、保存したいフォルダの上で右クリックし、「情報を見る」からエンコードされたフォルダ名を参照できる。たとえば「サイト運営」ならば次のように表示されるはず。
%26MLUwpDDIkEtVtg-
上記の先頭にある%26Mを&で置き換え、次のようにしたものが日本語をIMAP UTF-7にエンコードしたものとなる。
&MLUwpDDIkEtVtg-
keep
そのまま保持。特に記述しなければ、この動作がデフォルト。
次の例では、サイズが1M未満なら保持、1M以上なら破棄する。
if size :under 1M { keep; } else { discard; }
log
優先度INFOでログを出力する。require
でvnd.cyrus.log
を宣言する必要あり。Cyrus Sieve独自の拡張。
書式は次のとおり。
log <string>;
上の例は、次の記述と結果は同じ。
if not size :under 1M { discard; }
sieveの保存フォルダ名には、上記の値を指定してやる必要がある。
notify
ユーザに対して送信する通知。require
でenotify
を宣言する必要あり。
書式は次のとおり。
notify [":from" string]
[":importance" <"1" / "2" / "3">]
[":options" string-list]
[":message" string]
<method: string>
使用できるキーワードには、次のものがある。
:from
– 通知の作成者:importance
– 重要度。1: 重要、2: 普通、3: 重要でない。デフォルトは2:options
– 追加情報の送信:message
– 通知に含めるメッセージ
使用例1。
require ["enotify", "fileinto", "variables"];
if header :contains "from" "boss@example.org" {
notify :importance "1"
:message "おそらくとても重要"
"mailto:alm@example.com";
# これ以上は通知を送信しない
stop;
}
if header :contains "to" "sievemailinglist@example.org" {
# Subjectヘッダ値の取得 :matches を使用
if header :matches "Subject" "*" {
set "subject" "${1}";
}
# Subjectヘッダ値の取得 :matches を使用
if header :matches "From" "*" {
set "from" "${1}";
}
notify :importance "3"
:message "[SIEVE] ${from}: ${subject}"
"mailto:alm@example.com";
fileinto "INBOX.sieve";
}
使用例2。
require ["enotify", "fileinto", "variables", "envelope"];
if header :matches "from" "*@*.example.org" {
# MAIL FROMアドレスの取得に :matches を使用
if envelope :all :matches "from" "*" {
set "env_from" " [really: ${1}]";
}
# Subjectヘッダ値の取得 :matches を使用
if header :matches "Subject" "*" {
set "subject" "${1}";
}
# Fromヘッダからのアドレス取得に :matches を使用
if address :matches :all "from" "*" {
set "from_addr" "${1}";
}
notify :message "${from_addr}${env_from}: ${subject}"
"mailto:alm@example.com";
}
使用例3。
require ["enotify", "variables"];
set "notif_method"
"xmpp:tim@example.com?message;subject=SIEVE;body=You%20got%20mail";
if header :contains "subject" "Your dog" {
set "notif_method" "tel:+14085551212";
}
if header :contains "to" "sievemailinglist@example.org" {
set "notif_method" "";
}
if not string :is "${notif_method}" "" {
notify "${notif_method}";
}
if header :contains "from" "boss@example.org" {
# Subjectヘッダ値の取得に :matches を使用
if header :matches "Subject" "*" {
set "subject" "${1}";
}
# 「参考用」には、重要性の高い通知は不要
if not header :contains "subject" "参考用" {
notify :importance "1" :message "BOSS: ${subject}"
"tel:+14085551212";
}
}
redirect
転送。
書式は次のとおり。
redirect [":copy"] <address: string>
addressで指定されたアドレス宛てにメッセージを転送する。:copy
を指定すると、転送後もそのメッセージに対して処理を続けることができる。
:copy
を使用する場合、require
でcopy
を宣言する必要あり。
redirect "bart@example.com";
パイプに渡したりはできない。
reject
メールを拒否する。require
で宣言する必要あり。
書式は次のとおり。
reject <reason: string>
使用例。
require ["reject"];
if size :over 100K {
reject text:
Your message is too big. If you want to send me a big attachment,
put it on a public web site and send me a URL.
.
;
}
removeflag
メールからフラグを削除する。require
でimap4flags
を宣言する必要あり。
書式は次のとおり。
removeflag [<variablename: string>]
<list-of-flags: string-list>
使用例。
if header :contains "Disposition-Notification-To"
"mel@example.com" {
addflag "flagvar" "$MDNRequired";
}
if header :contains "from" "imap@cac.washington.example.edu" {
removeflag "flagvar" "$MDNRequired";
fileinto :flags "${flagvar}" "INBOX.imap-list";
}
set
変数を設定する。変数を利用するには、require
でvariables
を宣言する必要あり。
書式は次のとおり。
set [MODIFIER] <name: string> <value: string>
MODIFIERには次のものを利用できる。
:lower
– すべて小文字に変換:upper
– すべて大文字に変換:lowerfirst
– 先頭文字を小文字に変換:upperfirst
– 先頭文字を大文字に変換:quotewildcard
– 特殊 (*
、?
および\
) をエスケープ:length
– 文字列長
利用例。
set "a" "sample TEXT"; # ${a} は "sample TEXT"
set :length "b" "${a}"; # ${b} は "11"
set :lower "b" "${a}"; # ${b} は "sample text"
set :upperfirst "b" "${a}"; # ${b} は "Sample TEXT"
set :upperfirst :lower "b" "${a}"; # ${b} は "Sample text"
set :quotewildcard "b" "Rock*"; # ${b} は "Rock\*"
setflag
メールにフラグをセットする。既存のフラグを上書き。require
でimap4flags
を宣言する必要あり。
フラグには、次のようなものがある。
\Answered
– 返信済み\Deleted
– 削除済み\Draft
– 下書き\Flagged
– フラグ付き\Seen
– 既読
書式は次のとおり。
setflag [<variablename: string>]
<list-of-flags: string-list>
使用例。
if size :over 500K {
setflag "\\Deleted";
}
vacation
受信したメールに対して、すぐに応答できないときの処理。require
で宣言する必要あり。
書式は次のとおり。
vacation [":days" number] [":subject" string]
[":from" string] [":addresses" string-list]
[":mime"] [":handle" string] <reason: string>
使用できるキーワードは、次のとおり。
:days
– 応答できない期間。日数で指定:subject
– 返信メールのSubjectに使用するテキスト:from
– 返信メールのFromに使用するメールアドレス:addresses
– 自アドレスのリスト:mime
– reasonのMIME:handle
– 処理の種類をタグ付け
使用例。
require "vacation";
if header :contains "subject" "cyrus" {
vacation "I'm out -- send mail to cyrus-bugs";
} else {
vacation "I'm out -- call me at +1 304 555 0123";
}
:mime
の使用例。
require "vacation";
vacation :mime text:
Content-Type: multipart/alternative; boundary=foo
--foo
I'm at the beach relaxing. Mmmm, surf...
--foo
Content-Type: text/html; charset=us-ascii
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
"http://www.w3.org/TR/REC-html40/strict.dtd">
<HTML><HEAD><TITLE>How to relax</TITLE>
<BASE HREF="http://home.example.com/pictures/"></HEAD>
<BODY><P>I'm at the <A HREF="beach.gif">beach</A> relaxing.
Mmmm, <A HREF="ocean.gif">surf</A>...
</BODY></HTML>
--foo--
.
:handle
の使用例。異なるテキストを指定したvacation
コマンドが、いずれも同じ処理のために使われていると視認しやすいよう使用している。
require "vacation";
if header :contains "subject" "昼食" {
vacation :handle "逃亡" "外出中のため、昼食をご一緒できません。";
} else {
vacation :handle "逃亡" "外出中です。";
}
条件文
address
メールヘッダに指定されるアドレスを評価する。
書式は次のとおり。
address [":index" <fieldno: number> [":last"]]
[ADDRESS-PART] [COMPARATOR] [MATCH-TYPE]
<header-list: string-list> <key-list: string-list>
:index
を指定すると、ヘッダフィールド内の:index
番目のものを評価対象とする。:last
を指定すると、後ろから:index
番目のものを評価対象とする。:index
や:last
を利用するには、require
でindex
を宣言する必要あり。
使用例。
if address :is :all "from" "tim@example.com" {
discard;
}
allof
allof
は、渡された条件の論理積 (AND)。
allof (false, false)
→ falseallof (false, true)
→ falseallof (true, true)
→ true
anyof
anyof
は、渡された条件の論理和 (OR)。
allof (false, false)
→ falseallof (false, true)
→ trueallof (true, true)
→ true
body
メール本文を評価する。require
で宣言する必要あり。
書式は次のとおり。
body [COMPARATOR] [MATCH-TYPE] [BODY-TRANSFORM]
<key-list: string-list>
BODY-TRANSFORMに指定できるのは、次のいずれか。
:raw
:content
:text
:raw
は、メッセージをデコードする前の本文全体を対象に評価する。
:raw
の使用例。
require "body";
if body :raw :contains "MAKE MONEY FAST" {
discard;
}
:content
は後ろにcontent-typeを指定し、その内容を評価する。
:content
の使用例。
require ["body", "fileinto"];
# MIMEパートに "missile" または "coordinates" を含むメールを
# "secrets" フォルダに入れる。
if body :content "text" :contains ["missile", "coordinates"] {
fileinto "secrets";
}
# audio/mp3 MIMEパートを持つメールをすべて "jukebox"
# フォルダに入れる。
if body :content "audio/mp3" :contains "" {
fileinto "jukebox";
}
:text
は、メール中のテキスト本文を評価する。:content "text"
と同じ。
:text
の使用例。
require ["body", "fileinto"];
# プロジェクト日程に言及しているメールを "project/schedule" に
# 仕分けする
if body :text :contains "project schedule" {
fileinto "project/schedule";
}
currentdate
現在の日時を評価する。require
でdate
を宣言する必要あり。
書式は次のとおり。
currentdate [":zone" <time-zone: string>]
[COMPARATOR] [MATCH-TYPE]
<date-part: string>
<key-list: string-list>
date-partに指定できる文字列は、次のもの。
"year"
– 年。"0000"
〜"9999"
"month"
– 月。"01"
〜"12"
"day"
– 日。"01"
〜"31"
"date"
– yyyy-mm-dd形式の日付"julian"
– 修正ジュリアン日"hour"
– 時間。"00"
〜"23"
"minute"
– 分。"00"
〜"59"
"second"
– 秒。"00"
〜"60"
"time"
– hh:mm:ss形式の時刻"iso8601"
– 制限つきISO 8601形式の日時"std11"
– Dateヘッダに使われる形式の日時"zone"
– タイムゾーン"weekday"
– 曜日を表す数字。"0"
〜"6"
で、"0"
が日曜日
次の例では、変数${date}にyyyy-mm-dd形式の日付を設定する。
require ["date", "variables"];
if currentdate :matches "date" "*"
{
set "date" "${1}";
}
次の例では、週末および就業時間外に受信したメールを転送する。
require ["date", "relational"];
if anyof(currentdate :is "weekday" "0",
currentdate :is "weekday" "6",
currentdate :value "lt" "hour" "09",
currentdate :value "ge" "hour" "17")
{ redirect "pager@example.com"; }
次の例では、指定した期間内に受信したメールに自動応答する。
require ["date", "relational", "vacation"];
if allof(currentdate :value "ge" "date" "2007-06-30",
currentdate :value "le" "date" "2007-07-07")
{ vacation :days 7 "I'm away during the first week in July."; }
次の例では、年と月の名前をつけたフォルダにメールを仕分けする。
require ["date", "variables", "fileinto"];
if currentdate :matches "month" "*" { set "month" "${1}"; }
if currentdate :matches "year" "*" { set "year" "${1}"; }
fileinto "${month}-${year}";
次の例では、処理日時をヘッダに追加する。
require ["variables", "date", "editheader"];
if currentdate :matches "std11" "*"
{addheader "Processing-date" "${0}";}
date
メールヘッダから取得した日時を評価する。require
でdate
を宣言する必要あり。
書式は次のとおり。
date [":index" <fieldno: number> [":last"]]
[<":zone" <time-zone: string>> / ":originalzone"]
[COMPARATOR] [MATCH-TYPE] <header-name: string>
<date-part: string> <key-list: string-list>
date-partに指定できる文字列は、currentdate
と同じ。
:index
を指定すると、ヘッダフィールド内の:index
番目のものを評価対象とする。:last
を指定すると、後ろから:index
番目のものを評価対象とする。:index
や:last
を利用するには、require
でindex
を宣言する必要あり。
利用例。送信者が送った時刻を確認し、緊急性を判断して仕分けする。
require ["date", "relational", "fileinto"];
if allof(header :is "from" "boss@example.com",
date :value "ge" :originalzone "date" "hour" "09",
date :value "lt" :originalzone "date" "hour" "17")
{ fileinto "urgent"; }
利用例。最初のReceived:
フィールドを確認することで、ローカルシステムが実際に受信した時刻を判断している。
require ["date", "relational", "fileinto"];
if anyof(date :is "received" "weekday" "0",
date :is "received" "weekday" "6")
{ fileinto "weekend"; }
duplicate
重複確認。使用するには、require
でduplicate
を宣言する必要あり。
書式は次のとおり。
"duplicate" [":handle" <handle: string>]
[":header" <header-name: string> /
":uniqueid" <value: string>]
[":seconds" <timeout: number>] [":last"]
:header
と:unisqueid
のいずれも指定されない場合、ユニークIDはMessage-IDの内容となる。
:header
が指定されたとき、ユニークIDは指定したヘッダの内容となる。
:uniqueid
が指定されたとき、ユニークIDは指定された文字列となる。
次の3つの例は、いずれも同じ動作をする。
require "duplicate";
if duplicate {
discard;
}
require "duplicate";
if duplicate :header "message-id" {
discard;
}
require ["duplicate", "variables"];
if header :matches "message-id" "*" {
if duplicate :uniqueid "${0}" {
discard;
}
}
:handle
を使用すると、上記のようなデフォルト動作を上書きすることができる。
:seconds
を指定すると、現在時刻から指定した秒数内のメッセージを重複確認対象とする。指定がない場合のデフォルトは、7日間。
:last
を指定すると、重複対象とするメッセージの範囲を、現在時刻付近ではなく、指定された最後のメッセージの時刻付近とする。
次の例では、メールが重複していたときには、Trashの下のDuplicateフォルダに保存する。フォルダがなければ作成する。
require ["duplicate", "fileinto", "mailbox"];
if duplicate {
fileinto :create "Trash/Duplicate";
}
envelope
エンベロープの指定された部分が、条件にマッチするかチェックする。使用するにはrequire
でenvironment
を宣言する必要あり。
書式は次のとおり。
envelope [COMPARATOR] [ADDRESS-PART] [MATCH-TYPE]
<envelope-part: string-list> <key-list: string-list>
利用例。
require "envelope";
if envelope :all :is "from" "tim@example.com" {
discard;
}
environment
環境変数を取得。使用するにはrequire
でenvironment
を宣言する必要あり。
書式は次のとおり。
environment [COMPARATOR] [MATCH-TYPE]
<name: string>
<key-list: string-list>
nameに指定できるのは、次のもの。
"domain"
– sieveを実行しているホストのドメイン名"host"
– sieveを実行しているホスト名"location"
– sieveを実行している場所。"MTA"
(Message Transfer Agent)、"MDA"
(Mail Delivery Agent)、"MUA"
(Mail User Agent)、"MS"
(Message Store) のいずれか"name"
– プロダクト名"phase"
– sieveスクリプト実行のフェーズ。"pre"
、"during"
または"post"
のいずれか"remote-host"
– リモートクライアントのホスト名"remote-ip"
– リモートクライアントのIPアドレス"version"
– sieveインタープリタのプロダクトバージョン
exists
ヘッダ中に指定されたものが存在するかどうかをチェックする。
次の例では、ヘッダ中にFrom
ヘッダおよびDate
ヘッダが存在しない場合に、メールを廃棄する。
if not exists ["From","Date"] {
discard;
}
false
常に負。
header
指定されたヘッダが、指定されたキーのいずれかに条件がマッチする場合にtrueを返す。
書式は次のとおり。
header [":index" <fieldno: number> [":last"]]
[COMPARATOR] [MATCH-TYPE]
<header-names: string-list> <key-list: string-list>
:index
を指定すると、ヘッダフィールド内の:index
番目のものを評価対象とする。:last
を指定すると、後ろから:index
番目のものを評価対象とする。:index
や:last
を利用するには、require
でindex
を宣言する必要あり。
たとえば、次のようなヘッダがあったとする。
X-Caffeine: C8H10N4O2
このとき、次のように評価される。
header :is ["X-Caffeine"] [""]
=> falseheader :contains ["X-Caffeine"] [""]
=> true
ヘッダが存在しないか、または非空白文字をひとつも含んでいないかどうかを評価するには、ヘッダの条件を否定形で使用する。
not header :matches "Cc" "?*"
ihave
指定された名前のエクステンションが利用可能かどうかを評価。使用するにはrequire
でihave
を宣言する必要あり。
書式は次のとおり。
ihave <capabilities: string-list>
mailboxexists
指定された名前のメールボックスが存在するかどうかを評価。使用するにはrequire
でmailbox
を宣言する必要あり。
次の例では、Partners
というメールボックスが存在しなければ、メールを拒否する。
require ["fileinto", "reject", "mailbox"];
if mailboxexists "Partners" {
fileinto "Partners";
} else {
reject "このメールは受け付けられません。";
}
metadata
メールボックスのメタデータをチェックする。使用するにはrequire
でmailbox
を宣言する必要あり。
書式は次のとおり。
metadata [MATCH-TYPE] [COMPARATOR]
<mailbox: string>
<annotation-name: string> <key-list: string-list>
mailbox
でフォルダを指定し、そのフォルダでチェックしたいメタデータのアノテーション名をannotation-name
で指定し、key-list
に指定した値と比較する。
利用例。
require ["mboxmetadata", "vacation"];
if metadata :is "INBOX"
"/private/vendor/vendor.isode/auto-replies" "on" {
vacation text:
2024年3月まで休暇により不在です。
返信が遅くなりますので、ご注意ください。
.
}
not
否定。
servermetadata
サーバのメタデータをチェックする。使用するにはrequire
でservermetadata
を宣言する必要あり。
書式は次のとおり。
servermetadata [MATCH-TYPE] [COMPARATOR]
<annotation-name: string> <key-list: string-list>
チェックしたいメタデータのアノテーション名をannotation-name
で指定し、key-list
に指定した値と比較する。
servermetadataexsits
サーバのメタデータが存在するかどうかをチェックする。使用するにはrequire
でservermetadata
を宣言する必要あり。
書式は次のとおり。
servermetadataexists <annotation-names: string-list>
annotation-name
で指定したアノテーション名が存在するかどうかを返す。
size
size
はメッセージのサイズを評価する。
書式は次ように、:over
または:under
の後ろに数字を指定する。
size [":over" または ":under"] 数字
- size :over 4Kとした場合、4Kを越えるサイズのときtrue
- size :under 4Kとした場合、4K未満のサイズのときtrue
いずれもイコールは含まないため、4Kちょうどのときにはどちらもfalseとなる。
true
常に正。