?? rfc3028.txt
字號:
組織:中國互動出版網(http://www.china-pub.com/)
RFC文檔中文翻譯計劃(http://www.china-pub.com/compters/emook/aboutemook.htm)
E-mail:ouyang@china-pub.com
譯者:王安鵬(anpengwang anpengwang@263.net)
譯文發布時間:2002-1-9
版權:本中文翻譯文檔版權歸中國互動出版網所有。可以用于非商業用途自由轉載,但必須
保留本文檔的翻譯及版權信息。
Network Working Group T. Showalter
Request for Comments: 3028 Mirapoint, Inc.
Category: Standards Track January 2001
濾網:一種郵件過濾語言
(RFC3028——Sieve: A Mail Filtering Language)
本備忘錄的狀態
本備忘錄為Internet社區描述了一種Internet標準跟蹤協議,需要討論和建議以進一步
改進,關于本協議的便轉化進程和狀態請參閱“Internet正式協議標準”(STD 1)。本備忘錄
的發布沒有限制。
版權信息
Copyright (C) The Internet Society (2001). All Rights Reserved.
摘要
本文檔描述了一種語言,用于在最終遞交時過濾電子郵件,可以同時用于客戶端和服務
器端。設計的目標是易于擴展、應用簡便,并獨立于訪問協議、郵件架構和操作系統。這種
語言適合于在那些不允許用戶執行任何程序的郵件服務器上運行,比如暗箱Internet消息訪
問協議(IMAP)服務器,它不允許使用變量和循環結構,也不能調用外部程序。
目錄
1. 簡介 2
1.1. 本文檔使用的約定 3
1.2. 郵件消息樣例 3
2. 設計 4
2.1. 語言的形式 4
2.2. 空白字符 4
2.3. 注釋 5
2.4. 文字數據 5
2.5. 測試 6
2.6. 參數 6
2.7. 字符串的比較 7
2.8. 塊 8
2.9. 命令 9
2.10. 求值 9
3. 控制命令 10
3.1. 控制結構if 10
3.2. 控制結構Require 11
3.3. 控制結構Stop 11
4. 動作命令 11
4.1. 拒收(reject) 11
4.2. 轉存(fileinto) 12
4.3. 轉發(redirect) 12
4.4. 保存(keep) 12
4.5. 丟棄(discard) 12
5.測試命令 13
5.1. 地址測試(address) 13
5.2. 與測試(allof) 13
5.3. 或測試(anyof) 14
5.4. 信封測試(envelope) 14
5.5. 存在測試(exists) 14
5.6. false測試 15
5.7. 頭測試(header) 15
5.8. 非測試(not) 15
5.9. 長度測試(size) 15
5.10. true測試 15
6. 擴展特性 16
6.1功能描述串 16
6.2. IANA方面的問題 16
6.3. 功能遷移 17
7. 傳輸 17
8. 解析(Parsing) 18
8.1. 詞法記號 18
8.2. 語法 19
9. 擴展的例子 20
10. 安全性問題 21
11. 鳴謝 21
12. 作者地址 22
13. 參考 22
14. 版權聲明 23
1. 簡介
本文提出了一種可用于實現電子郵件過濾的語言,不依賴于任何操作系統或者郵件框
架。這種語言要求消息必須符合[IMAIL]標準,但是把這一規范推廣到許多其他的系統。這
種語言具有強大的功能,但是為了保證服務器過濾系統的安全而作了一些限制。這樣做的目
的是除了編寫簡單的郵件過濾器(可以很方便地建立過濾器的圖形用戶界面),避免用戶做
更復雜的(危險的)操作。這種語言還不完備,不能編寫循環語句,也沒有提供變量和函數。
用濾網編寫的描述程序在最終完成遞送的時候——就是說郵件要移動到用戶可以訪問
的郵箱時執行。在MTA完成最后遞交工作的系統中,比如傳統的UNIX郵件系統,MTA最
終把郵件堆放到用戶信箱中時還要作適當的排序處理。
使用郵件過濾有多方面的原因。隨著電子郵件的普及,主動郵件如廣告的出現以及郵件
列表的大量使用,許多用戶遇到了郵件擁塞的問題。卡內基.梅隆的經歷表明,只要存在可
用的過濾系統,許多人都會使用它來濾掉來自特定用戶或列表的消息。但是由于設置困難,
許多人并沒有使用安德魯系統的FLAMES過濾語言。因此為了使用戶方便地使用過濾,這
種語言設計的盡量簡單,但同時又具有足夠的能力完成工作。對于多數用戶而言,最好是提
供一種圖形用戶界面的過濾編輯器。
1.1. 本文檔使用的約定
這一節說明本文中涉及到的各種關鍵字和操作符的明確含義,約定如下。
文中關鍵字“MUST”、“MUST NOT”、“SHOULD”、“SHOULD NOT”和“MAY”的
含義按照[KEYWORDS]的解釋。在描述命令(測試、動作或控制結構)時都有一行以“語
法:”開始,說明命令的語法,包括命令名和參數。不能缺少的參數放在一對尖括號內,可
選參數則放在一對方括號內。每個參數后面都跟著數據類型,比如“<key: string>”表示一
個字符串類型的參數key。與[ABNF]類似,文字串用引號表示,轉義字符使用斜杠標志,允
許使用括號進行組合。
在語法描述中,經常會遇到一些語法片段,如MATCH-TYPE、COMPARATOR和
ADDRESS-PART,詳細含義參見后述。第10節所描述的形式命令語法僅僅作為構造命令的
權威參考,但是形式語法沒有規定命令形式參數的順序、語義、個數和類型,也沒有規定哪
些命令名是合法的,形式語法的意義在于以后對該語言進行擴展時可以保證語法的一致性。
1.2. 郵件消息樣例
下面是本文所使用的郵件樣例。
Message A
-----------------------------------------------------------
Date: Tue, 1 Apr 1997 09:06:31 -0800 (PST)
From: coyote@desert.example.org
To: roadrunner@acme.example.com
Subject: I have a present for you
Look, I'm sorry about the whole anvil thing, and I really
didn't mean to try and drop it on you from the top of the
cliff. I want to try to make it up to you. I've got some
great birdseed over here at my place--top of the line
stuff--and if you come by, I'll have it all wrapped up
for you. I'm really sorry for all the problems I've caused
for you over the years, but I know we can work this out.
--
Wile E. Coyote "Super Genius" coyote@desert.example.org
-----------------------------------------------------------
Message B
-----------------------------------------------------------
From: youcouldberich!@reply-by-postal-mail.invalid
Sender: b1ff@de.res.example.com
To: rube@landru.example.edu
Date: Mon, 31 Mar 1997 18:26:10 -0800
Subject: $$$ YOU, TOO, CAN BE A MILLIONAIRE! $$$
YOU MAY HAVE ALREADY WON TEN MILLION DOLLARS, BUT I DOUBT
IT! SO JUST POST THIS TO SIX HUNDRED NEWSGROUPS! IT WILL
GUARANTEE THAT YOU GET AT LEAST FIVE RESPONSES WITH MONEY!
MONEY! MONEY! COLD HARD CASH! YOU WILL RECEIVE OVER
$20,000 IN LESS THAN TWO MONTHS! AND IT'S LEGAL!!!!!!!!!
!!!!!!!!!!!!!!!!!!111111111!!!!!!!11111111111!!1 JUST
SEND $5 IN SMALL, UNMARKED BILLS TO THE ADDRESSES BELOW!
-----------------------------------------------------------
2. 設計
2.1. 語言的形式
該語言由一系列命令組成,命令由多個空白字符分隔的記號組成。命令標識符是第一個
記號,后面可以有多個參數記號(也可以沒有),參數可以是文字數據、標簽、命令塊或者
測試命令。該語言用UTF-8表示,ASCII記號區分大小寫。
2.2. 空白字符
空白字符用于分隔記號,包括制表符、新行字符(CRLF,不能只使用CR或LF)和空
格,不考慮空白字符的個數。
2.3. 注釋
該語言提供了兩種類型的注釋,注釋在語義上與空白字符是等效的,空白字符可以出現
的地方都可以使用注釋(只有一個例外,即多行字符串,參見后述)。第一種格式是使用一
個井號字符“#”(必須在表示字符串的引號外),后面的字符串直到下一個回車換行符都被
視作注釋內容。例如: if size :over 100K { # this is a comment discard; }。第二種方法是使用
記號“/*”和“*/”(不能在字符串引號內),這樣的注釋可以是多行的,但不能嵌套,如:
if size :over 100K { /* this is a comment
this is still a comment */ discard /* this is a comment
*/ ;
}
2.4. 文字數據
文字是指作為命令參數的非執行數據,僅僅就其本身取值,僅限于數字和字符串。
2.4.1. 數字
數字是普通的十進制數, 不過那些很大的數值比如消息的長度后面可以加上表示2的
冪的字符“K”、“M”或者“G”。它們的含義按照通常使用的國際單位制,K表示千或1024,
M表示百萬或1048576,G表示十億或1073741824(2的30次冪)。具體的實現至少要提供
31bit的量級,本規范只使用正整數。
2.4.2. 字符串
該描述語言在很多地方要使用字符串,比如模式匹配、地址以及文本體等等。一般來說,
大多數情況下使用引號括起來的短字符串就足夠了,但是還提供了一種適用于長字符串如消
息體的字符串格式。引號字符串開始和結束都是雙引號字符(ASCII 34)引號字符串中可以
包含反斜杠字符,但它后面必須是反斜杠或者雙引號,前者表示反斜杠字符本身,后者表示
字符串中的引號。未經定義的轉義序列作為不含反斜杠的序列處理(比如“\a”就認為是“a”)。
引號字符串中不能包含制表符、回車換行符和控制字符之類的非打印字符。引號字符串允許
跨行,但不能包含空字符NUL(ASCII 0)。
為了便于處理大量的文本,該語言還提供了一種多行字符串。多行字符串一“text:”和
一個回車換行符開始,最后以回車換行、句點和回車換行符結束。為了避免與只包含一個句
點的信息行混淆,我們采用填充法,即對于那些第一個字符是“.”的行在前面再人為增加
一個額外的“.”。服務器對這樣的描述語句解釋時再把多余的句點去掉。注意,對于以句點
開頭但后面跟著的字符不是“.”的行,不作為句點填充處理,就是說“.foo”仍然是“.foo”。
由于這種情況有可能造成混亂,因此編輯器必須正確的處理句點填充避免出現這種情況。
注意,在“text:”和CRLF之間可以加入斜杠開始的注釋成分,但不能插入到字符串本
身,也不允許使用“#”開始的注釋。
2.4.2.1. 字符串列表
由于模式匹配經常對一組字符串進行匹配,因此許多測試命令允許使用字符串列表,只
要測試對其中的一個字符串成立測試結果即為真。建議實現時對這種情況采用短循環求值的
方法。比方說,對于測試命令“header :contains ["To", "Cc"] ["me@example.com",
"me00@landru.example.edu"]”,只要輸入的消息包含郵件地址me@example.com或者
me00@landru.example.edu中的一個,測試結果即為真。相反,只要允許使用字符串列表的
地方,都可以使用單個的字符串,它被認為是只有一個成員的字符串列表。就是說,測試命
令“exists "to"”和“exists ["to"]”是等價的。
2.4.2.2. 信息頭
信息頭是一個字符串子集,根據Internet消息規范[IMAIL,RFC1123],每行信息頭差不
多任何地方都可以使用空白字符,在消息頭的名稱和后面的冒號之前也允許出現空白字符,
但是消息頭名稱和后面冒號之間的空白字符在處理時被忽略掉。消息頭名稱不能包含冒號,
比如“From”表示以“From:”或“From :”開始的一行消息頭,但是沒有任何消息頭與
字符串“From:”匹配。對數據進行解釋之前,跨行的消息頭要合并成一行,各行位的CRLF
以及下一行的前導空格轉換成單個空格。
2.4.2.3. 地址
有幾個處理郵件地址的命令,郵件地址也是一種特殊的字符串。如果地址字符串需要用
于其它的應用環境,除了必須符合[IMAIL]的規定外,還有其他的限制。按照[IMAIL]第6.1
節定義的符號,地址的語法格式為:
sieve-address = addr-spec ; simple address
/ phrase "<" addr-spec ">" ; name & addr-spec
就是說,地址中不能出現路由或者地址組語法,如果需要使用多個地址,必須是用字符
串列表,而不能用命名的地址組。實現必須保證地址的語法是有效的,但不要求必須是郵件
接收方。
2.4.2.4. MIME部分
在少數幾個地方,[MIME]消息體部分也用字符串表示,其中包括MIME頭部和消息體。
這樣就提供了一種在濾網描述語言程序中嵌入其它類型數據的方法,從而能夠在輸出的消息
中使用UTF-8之外的字符集。
2.5. 測試
測試作為命令的參數用于控制命令的行為方式。在本文中,測試以if/elseif/else的方式
給出,根據測試結果選擇要執行的代碼段。測試不能有副作用,就是說不能改變過濾器和消
息的狀態。本規范規定的測試都沒有副作用,同樣的限制也適用于擴展測試命令。這樣做是
因為帶有副作用的測試難以閱讀和維護,而且不方便通過圖形用戶界面生成描述語句。只有
那些作用明確的動作才允許改變過濾器的狀態。
2.5.1. 測試列表
有些測試可能需要多個測試參數(比如分別對應邏輯與和邏輯或的“allof”和“anyof”),
測試列表元素提供了成組測試的方法。例如:
if anyof (not exists ["From", "Date"],
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -