sieveの書き方

まとまった資料がないので、自分が必要な分だけまとめておく。

sieveについて

sieveとは

sieveとは、メールフィルターを定義するための言語。sieveそのものは、RFCで定義されている。

規格

基本的な書き方

基本的な構文

sieveの文には、次の三種類がある。

最もシンプルなのは、アクション文。セミコロンで終了する。

制御文は、セミコロンの代わりにブロックで終了する。

条件文は、制御文の一部を構成する。

コメント

コメントには、二種類の書き方がある。

  • # から行末まで
  • /**/ で囲んだ部分。改行を含めることができる

# の使用例。

if size :over 100k { # この部分はコメント
    discard;
}

/**/ の使用例。

if size :over 100K { /* この部分はコメント
    この部分もまだコメント */ discard /* この部分もコメント
    */ ;
}

数字

数字は正の整数のみ使用できる。

単位の大きい数字を記述するために、KMGが使用可。

  • 1K1024 と同じ
  • 1M1024K と同じ
  • 1G1024M と同じ

文字列

文字列は、ダブルクォーテーションで囲う。

文字列リスト

[] で囲み、文字列をリスト化することができる。

たとえば次の例では、To または Ccme@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では、 * は任意の文字列、? は任意の一文字にマッチする。テキスト中で ? や * をワイルドカードとしてではなく文字そのものとして使用したい場合には、"\\*""\\?" のようにエスケープする必要がある。

正規表現を使用する場合には、requireregexpを宣言する必要あり。

コンパレータ (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を使用するには、requiresubaddressを宣言する必要あり。

変数

sieveの中で、変数を扱うことができる。変数を利用するには、requirevariablesを宣言する必要あり。

変数名が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文は、ifelif、および 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を何度も使うと、その都度フラグが増えていく。requireimap4flagsを宣言する必要あり。

書式は次のとおり。

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

メールヘッダを追加する。requireeditheaderを宣言する必要あり。

書式は次のとおり。

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独自の拡張。使用するには、requirevnd.dovecot.debugを宣言する必要あり。

書式は次のとおり。

debug_log <message: string>

ただし、Roundcubeではベンダーの独自拡張をサポートしていない。

deleteheader

メールヘッダを削除する。requireeditheaderを宣言する必要あり。

書式は次のとおり。

deleteheader [":index" <fieldno: number> [":last"]]
             [COMPARATOR] [MATCH-TYPE]
             <field-name: string>
             [<value-patterns: string-list>]

使用できるキーワードには、次のものがある。

  • :index – 削除するヘッダフィールドの位置
  • :last – 位置を後ろからカウント

次の例では、Delivered-Tobob@example.com が含まれていた場合に、最初のヘッダフィールドを削除する。

deleteheader :index 1 :contains "Delivered-To"
    "bob@example.com";

discard

破棄。

利用例。

if header :contains ["from"] ["idiot@example.com"] {
    discard;
}

error

ランタイムエラーとしてsieveスクリプトの実行を中止する。使用するにはrequireihaveを宣言する必要あり。

書式は次のとおり。

error <message: string>

指定されたエラーメッセージは、エラーログに残される。

fileinto

フォルダを指定して保存。requirefileintoを宣言する必要あり。

fileinto [:specialuse <special-use-attr: string>]
         [:copy] [:create] <mailbox: string>

使用できるキーワードは、次のとおり。

  • :specialuse – 特別なフォルダーの指定
  • :create – 存在しなければフォルダを作成
  • :copy – コピーをフォルダに入れる

:specialuseを使う場合、requirespecial-useを宣言する必要あり。「特別なフォルダー」には、次の者がある。

  • \All – すべてのメッセージ
  • \Archive – アーカイブ
  • \Drafts – 下書き
  • \Flagged – マーク済み
  • \Junk – 迷惑メール
  • \Sent – 送信済み
  • \Trash\Trash – ごみ箱

:createを使用する場合、requiremailboxを宣言する必要あり。

:copyを使用する場合、requirecopyを宣言する必要あり。

次の例では、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の使用例。特別なフォルダー\JunkSpamも存在しないとき、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でログを出力する。requirevnd.cyrus.logを宣言する必要あり。Cyrus Sieve独自の拡張。

書式は次のとおり。

log <string>;

上の例は、次の記述と結果は同じ。

if not size :under 1M { discard; }

sieveの保存フォルダ名には、上記の値を指定してやる必要がある。

notify

ユーザに対して送信する通知。requireenotifyを宣言する必要あり。

書式は次のとおり。

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を使用する場合、requirecopyを宣言する必要あり。

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

メールからフラグを削除する。requireimap4flagsを宣言する必要あり。

書式は次のとおり。

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

変数を設定する。変数を利用するには、requirevariablesを宣言する必要あり。

書式は次のとおり。

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

メールにフラグをセットする。既存のフラグを上書き。requireimap4flagsを宣言する必要あり。

フラグには、次のようなものがある。

  • \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を利用するには、requireindexを宣言する必要あり。

使用例。

if address :is :all "from" "tim@example.com" {
    discard;
}

allof

allof は、渡された条件の論理積 (AND)。

  • allof (false, false) → false
  • allof (false, true) → false
  • allof (true, true) → true

anyof

anyof は、渡された条件の論理和 (OR)。

  • allof (false, false) → false
  • allof (false, true) → true
  • allof (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

現在の日時を評価する。requiredateを宣言する必要あり。

書式は次のとおり。

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

メールヘッダから取得した日時を評価する。requiredateを宣言する必要あり。

書式は次のとおり。

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を利用するには、requireindexを宣言する必要あり。

利用例。送信者が送った時刻を確認し、緊急性を判断して仕分けする。

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

重複確認。使用するには、requireduplicateを宣言する必要あり。

書式は次のとおり。

"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

エンベロープの指定された部分が、条件にマッチするかチェックする。使用するにはrequireenvironmentを宣言する必要あり。

書式は次のとおり。

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

環境変数を取得。使用するにはrequireenvironmentを宣言する必要あり。

書式は次のとおり。

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を利用するには、requireindexを宣言する必要あり。

たとえば、次のようなヘッダがあったとする。

 X-Caffeine: C8H10N4O2

このとき、次のように評価される。

  • header :is ["X-Caffeine"] [""] => false
  • header :contains ["X-Caffeine"] [""] => true

ヘッダが存在しないか、または非空白文字をひとつも含んでいないかどうかを評価するには、ヘッダの条件を否定形で使用する。

not header :matches "Cc" "?*"

ihave

指定された名前のエクステンションが利用可能かどうかを評価。使用するにはrequireihaveを宣言する必要あり。

書式は次のとおり。

ihave <capabilities: string-list>

mailboxexists

指定された名前のメールボックスが存在するかどうかを評価。使用するにはrequiremailboxを宣言する必要あり。

次の例では、Partnersというメールボックスが存在しなければ、メールを拒否する。

require ["fileinto", "reject", "mailbox"];
if mailboxexists "Partners" {
    fileinto "Partners";
} else {
    reject "このメールは受け付けられません。";
}

metadata

メールボックスのメタデータをチェックする。使用するにはrequiremailboxを宣言する必要あり。

書式は次のとおり。

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

サーバのメタデータをチェックする。使用するにはrequireservermetadataを宣言する必要あり。

書式は次のとおり。

servermetadata [MATCH-TYPE] [COMPARATOR]
    <annotation-name: string> <key-list: string-list>

チェックしたいメタデータのアノテーション名をannotation-nameで指定し、key-listに指定した値と比較する。

servermetadataexsits

サーバのメタデータが存在するかどうかをチェックする。使用するにはrequireservermetadataを宣言する必要あり。

書式は次のとおり。

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

常に正。

タイトルとURLをコピーしました