?? rfc3028.txt
字號:
如果完全不進行過濾,則“保存”命令代替了所有其他的命令,一般而言就是簡單地把
消息轉存到用戶的主郵箱內。執行該命令不需要知道主郵箱的名稱、用戶的郵箱設置或者底
層使用的郵件系統。比方說,對于在郵件遞交時執行代表用戶的描述程序的IMAP服務器,
保存命令就相當于轉存到“INBOX”。
例1: if size :under 1M { keep; } else { discard; }
注意上述語句等價于下面的命令:
例2: if not size :under 1M { discard; }
4.5. 丟棄(discard)
語法: discard
“丟棄”命令簡單地把消息刪除,就是取消了隱含留存操作。如果與其它的動作命令合
用,其他的命令照常執行,即該命令與其他命令是兼容的,比如fileinto + discard就相當于
fileinto。丟棄命令不得產生其它的作用,不得返回任何未遞交通知或者其他的[DSN]、[MDN]
消息。下面的語句丟掉任何來自“idiot@example.edu”的郵件:
例子: if header :contains ["from"] ["idiot@example.edu"] {
discard;
}
雖然該命令是本語言的重要組成部分,但可能給用戶帶來嚴重的問題,在公用機房內上
機的學生如果沒有退出登錄可能會發現它的描述程序都被人改成了“丟棄”命令。為了保護
此類情形下的用戶信息,實現可以采用把銷毀信息保存一段時間的方法,或者禁止丟棄全部
郵件的描述語句。
5.測試命令
測試命令用于條件控制結構判定執行哪一個條件,實現必須支持以下測試命令:
"address"、"allof"、"anyof"、"exists"、"false"、"header"、"not"、"size"和"true",應該支持“envelope”
測試。
5.1. 地址測試(address)
語法: address [ADDRESS-PART] [COMPARATOR] [MATCH-TYPE]
<header-list: string-list> <key-list: string-list>
地址測試試圖與包含地址的結構頭中的Internet地址進行匹配,只要按照指定的比較運
算子和匹配關鍵字,頭中地址的指定部分包含給定的某個關鍵字,則返回真。該測試與信封
測試和頭測試類似,只要頭列表和關鍵字列表中的某兩個匹配成功即返回真。
Internet郵件地址標準[IMAL]的某些規定不合情理,@左側的本地部分大小敏感,而右
側的域地址部分則不區分大小寫。“地址”命令本身并不對此區分,而是通過ADDRESS-PART
參數讓用戶來處理。地址原語永遠不會處理郵件地址中的短語部分或者地址中的說明成分,
也不會處理組名,盡管要處理組結構內的地址。
實現必須把地質測試嚴格限制在包含地址的頭字段內,至少要包括From、To、Cc、Bcc、
Sender、Resent-From和Resent-To,還應該支持其他使用“地址列表”的頭字段。
例子: if address :is :all "from" "tim@example.com" {
discard;
5.2. 與測試(allof)
語法: allof <tests: test-list>
allof測試對指定的測試項進行邏輯與運算,例如:
allof (false, false) => false
allof (false, true) => false
allof (true, true) => true
與測試的參數是一個測試列表。
5.3. 或測試(anyof)
語法: anyof <tests: test-list>
anyof對指定的測試進行邏輯或運算。
例子: anyof (false, false) => false
anyof (false, true) => true
anyof (true, true) => true
5.4. 信封測試(envelope)
語法: envelope [COMPARATOR] [ADDRESS-PART] [MATCH-TYPE]
<envelope-part: string-list> <key-list: string-list>
如果SMTP(或者等價的)信封的指定部分與給定的關鍵字匹配,則“信封”測試返回
真。如果信封部分的字符串是(不考慮大小寫)“from”,那么就與SMTP MAIL命令中使用
的FROM地址進行匹配。如果信封部分的字符串是(不考慮大小寫)“to”,則與SMTP RCPT
命令中使用的TO地址匹配。要注意只能使用最近的而且與該用戶相關的一個TO。信封部
分是一個字符串列表,,可以包含多個參數,這樣的話,關鍵字列表中的所有字符串都與信
封部分列表中的各個成分進行匹配。與地址測試和頭測試類似,只要信封中的某個成分匹配
關鍵字列表中的一個,測試結果即為真。所有對信封的測試都必須去掉源路徑。
如果SMTP會話包括多個RCPT命令,只有把信息傳遞給該用戶的那個RCPT命令數
據才能用于信封的“to”部分。如果傳輸時使用了SMTP之外的協議,建議實現時相應地對
該命令進行調整。
信封命令時可選的,實現應該支持這個命令,但某些時候可以得不到可用的信息。
例子: require "envelope";
if envelope :all :is "from" "tim@example.com" {
discard;
}
5.5. 存在測試(exists)
語法: exists <header-names: string-list>
如果消息中包含頭字段名參數中列出的頭字段,則存在測試返回真——必須所有給定的
頭字段都存在。下面的例子丟棄了沒有From和Date頭字段的所有郵件:
例子; if not exists ["From","Date"] {
discard;
}
5.6. false測試
語法: false
“false”測試總是返回假。
5.7. 頭測試(header)
語法: header [COMPARATOR] [MATCH-TYPE]
<header-names: string-list> <key-list: string-list>
只要一個頭字段名與給定關鍵字中的某一個匹配,“頭”測試就返回真。匹配類型由可
選的匹配參數指定,如前所述,如果沒有給出這個參數則缺省使用“:is”。與地址測試和信
封測試類似,只要字符串列表任一項與關鍵字列標參數中的某一個相匹配,測試的結果即為
真。如果頭字段名參數列出的頭字段存在,則包含空鍵值(“”),否則不能包含空鍵值。因
此如果消息包含這樣的頭字段X-Caffeine: C8H10N4O2,則測試結果如下:
header :is ["X-Caffeine"] [""] => false
header :contains ["X-Caffeine"] [""] => true
5.8. 非測試(not)
語法: not <test>
“not”測試的參數是其他的測試,返回與參數相反的結果,“not false”相當于“true”,
“not true”等價于“false”。
5.9. 長度測試(size)
語法: size <":over" / ":under"> <limit: number>
“size”測試檢查消息的長度,該命令的參數包括一個標志參數“:over”或者“:under”
和表示消息大小的一個數字。如果使用“:over”參數,則只有消息的長度超過給定大小時
才返回真;如果使用了“:under”參數,則僅當消息的長度不超過給定大小時才返回真。必
須指定這兩個標志參數中的一個。消息的長度定義為從消息頭的第一個字節開始到消息體的
最后一個字符結束的全部字節數。注意,如果某個消息恰好是4000個字節,則它既不超過
(over)也不少于(under)4000個字節。
5.10. true測試
語法: true
“true”測試的結果永遠是真。
6. 擴展特性
本語言允許增加新的結構、動作或者測試,網站必須把它所提供的擴展功能通知用戶,
本規范沒有定義如何獲取服務器所提供的擴展功能列表。本語言的任何擴展必須定義一個功
能描述字符串唯一標識該擴展。如果擴展功能的新版本改變了功能或者原來的定義,則必須
使用一個新的描述串。如果存在一個提交協議和清楚本語言細節的擴展說明機制,那么提交
的描述程序可以通過檢查郵件服務器禁止使用該服務器不支持的擴展。擴展必須明確自身與
其它操作的關系,就是要說明它是否禁止隱含留存,能夠與那些操作兼容,與那些操作不兼
容。
6.1功能描述串
功能描述串通常是描述服務器所支持的功能的短字符串。以“vnd”開頭的功能描述串
表示供應商定義的擴展,此類擴展未經Internet標準或RFC定義,但是為了避免引起混亂經
過了IANA的注冊。以“vnd”開始的功能描述串后面應該跟上供應商或者產品的名稱,比
如“vnd.acme.rocket-sled”。
本規范定義的功能描述串包括:
envelope 串“envelope”表示該實現支持“信封”命令。
fileinto 串“fileinto”表明該實現支持“轉存”命令。
reject 串“reject”表明該實現支持“拒收”命令。
Comparator 如果實現支持“elbonia”比較運算子,則提供串“comparator-elbonia”,
因此所有的實現至少要支持“comparator-i;octet”和“comparator-i;ascii-casemap”,但是使用
這兩個運算子不需要事先用require聲明。
6.2. IANA方面的問題
為了建立一個標準的擴展集,IANA提供了一項注冊事務,按照先來先提供的原則對擴
展功能進行注冊,用于交互的擴展應該定義為標準跟蹤或者IESG認可的實驗性RFC。
6.2.1. 功能注冊模板
可以使用如下的模板向IANA請求注冊對濾網語言的新擴展。
To: iana@iana.org
Subject: Registration of new Sieve extension
功能名Capability name:
關鍵字Capability keyword:
功能參數Capability arguments:
標準號Standards Track/IESG-approved experimental RFC number:
聯系地址Person and email address to contact for further information:
6.2.2. 功能注冊的最初內容
以下是經過IANA注冊的基本的濾網語言擴展內容:
功能名: fileinto
關鍵字: fileinto
參數: fileinto <folder: string>
標準號: RFC 3028 (Sieve base spec)
聯系地址: Tim Showalter tjs@mirapoint.com
功能: reject
關鍵字: reject
參數: reject <reason: string>
標準號: RFC 3028 (Sieve base spec)
聯系地址: Tim Showalter tjs@mirapoint.com
功能: envelope
關鍵字: envelope
參數: envelope [COMPARATOR] [ADDRESS-PART] [MATCH-TYPE]
<envelope-part: string-list> <key-list: string-list>
標準號: RFC 3028 (Sieve base spec)
聯系地址: Tim Showalter tjs@mirapoint.com
功能: comparator-*
關鍵字: comparator-* (anything starting with "comparator-")
參數: (none)
標準號: RFC 3028, Sieve,參考RFC 2244
聯系地址: Tim Showalter tjs@mirapoint.com
6.3. 功能遷移
由于本規范所應用的郵件系統是各種各樣的,具體的實現又各有不同,因此無法說明某
個實現所支持的功能,但是具體的實現應該具有這樣一種機制,能夠列出所支持的完整的擴
展集。
7. 傳輸
濾網描述程序的MIME類型為“application/sieve”。RFC 2048要求對該類型的注冊如下:
主題:注冊MIME媒體類型application/sieve
MIME媒體類型名稱: application
MIME 字類型名: sieve
必要的參數:無
可選參數:無
編碼要求:大多數濾網描述成分應該是UTF-8格式的文本,如果沒有使用7位字
符,對于使用7位字符的傳輸系統應使用引號括起來的可打印字符。
安全性問題:在RFC2048的第10節討論。
交互性問題:在RFC 3028的第2.10.5節討論。
正式規范: RFC 3028.
應用該媒體類型的程序:支持濾網語言的郵件服務器
附加信息:
幻數(Magic number):
文件擴展名: .siv
Macintosh文件類型碼:
聯系地址
參見ietf-mta-filters@imc.org的討論列表。
應用范圍:
COMMON(通用)
作者/負責控制變動的人員:
參見RFC 3028的作者信息
8. 解析(Parsing)
像大多數語言一樣,濾網語法也分為記號和單獨的語法。
8.1. 詞法記號
濾網描述語言采用UTF-8編碼,在下面的說明中假設濾網描述語言所使用的合法UTF-8
的特殊字符都是ASCII字符。
濾網語言中的記號包括:標識符、標簽、數字、引號字符串、多行字符串和其他分隔符。
空白、水平制表符、回車換行符和注釋(“空白字符”)僅僅作為分隔記號,相鄰的記號
之間和多行字符串的某些特定位置需要使用空白字符分隔。其他的分隔符都是單獨的字符,
并且在語法中有明確的定義。濾網的詞法結構采用如下的BNF范式定義(參見[ABNF])。
bracket-comment = "/*" *(CHAR-NOT-STAR / ("*" CHAR-NOT-SLASH)) "*/"
;; No */ allowed inside a comment.
;; (No * is allowed unless it is the last character,
;; or unless it is followed by a character that isn't a
;; slash.)
CHAR-NOT-DOT = (%x01-09 / %x0b-0c / %x0e-2d / %x2f-ff)
;; no dots, no CRLFs
CHAR-NOT-CRLF = (%x01-09 / %x0b-0c / %x0e-ff)
CHAR-NOT-SLASH = (%x00-57 / %x58-ff)
CHAR-NOT-STAR = (%x00-51 / %x53-ff)
comment = bracket-comment / hash-comment
hash-comment = ( "#" *CHAR-NOT-CRLF CRLF )
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -