⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rfc3028.txt

📁 本程序为在linux下实现FTP传输文件的实现
💻 TXT
📖 第 1 页 / 共 4 页
字号:
组织:中国互动出版网(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 + -