本页,连同 Sieve 脚本和 SecurityGateway Sieve 扩展命令页,提供了有关 Sieve 邮件过滤语言及其在 SecurityGateway 中应用的基本纲要。本页的第一部分概述了 Sieve 脚本的基本组成部分。下一部分概述了该语言的多种结构单元。然后是所支持的标准控制、测试和操作命令的列表。最后,在页面下方提供了多个脚本范例供审阅。
要了解有关 Sieve 邮件过滤语言的更详尽说明,应在线查看 IETF 网站的权威文档: Sieve: An Email Filtering Language (RFC-5228), Sieve's Copy Extension (RFC 3894), Sieve's Body Extension (RFC-5173), Sieve's Reject Extension (RFC-5429), Sieve's Variables Extension (RFC-5229), and Spamtest and VirusTest Extensions (RFC-3685)。 您可以访问 www.mdaemon.com/Support/ 以获得 SecurityGateway 最新的技术支持与帮助选项,包括: 电话支持、邮件支持、知识库、常见问题解答和社区论坛等。 |
Sieve 脚本有四个基本组成部分:
1.需求—该部分用于声明给定脚本所需的 Sieve 扩展命令。如果脚本中要使用可选的扩展命令,则必须使用 require 控制命令在脚本开头列出所需的那些扩展命令。require 命令的参数末尾需添加分号。
示例:
require "securitygateway";
-and-
require ["securitygateway", "fileinto"];
2.条件—在脚本的这一部分中可说明在邮件中要查找的内容特定类型以及测试并比较这些内容的方式。
示例:
if size :over 1M
-and-
if header :contains ["to", "cc"] "Frank Thomas"
3.操作—该部分为当指定条件为“True”时要实施的操作和要执行的命令。每一操作必须后接分号,且每一组操作必须包含在大括号内(即 "{" 和 "}")。
示例:
if size :over 1M { discard; }
-and-
if header :contains ["to", "cc"] "Frank Thomas" {
bayes-learn "spam";
fileinto "spam";
}
4.注释—可以在 Sieve 脚本中包含注释供自己参考,以提醒自己该脚本的功能等等。有两种注释可供使用: 单行注释和多行注释。单行注释以 "#" 开头并一直延续到行末(即至下一个 CRLF)。多行注释以 "/*" 开头,可跨越多行文本,然后以 "*/" 结尾。
示例:
# 删除超过 1 mb 的邮件
if size :over 1M { discard; }
-and-
if header :contains "from" "Frank Thomas" {
/* Frank Thomas 常常给我们发送垃圾邮件,因此该脚本
自动将自他那儿收到的所有内容移入
用户隔离队列。*/
fileinto "spam";
}
字符串
文本字符串开头和结尾使用单个双引号。例如: "Frank Thomas".
要在用引号括起来的字符串中包含反斜杠或双引号,必须在该字符前添加另一个反斜杠。因此,在用引号括起来的字符串中,\\ 将被视为 \ 且 \" 将被视为 "。字符串中的其他字符无需换码。
字符串列表
每当您希望在脚本中使用一组字符串时,请用逗号分隔各条用引号括起来的字符串,并将该组字符串用方括号括起来。
示例:
if header :contains ["to", "cc"] ["me@xyz.com", "you@xyz.com", "us@xyz.com"]
如果 To 或 CC 报头包含以上三条地址中的任一条,该测试结果即为 True。
报头
报头名中不得包含冒号。
示例:
if header :is "to:" (无效)
if header :is "to"(有效)
测试列表
类似于字符串列表,脚本中可包含一组测试(用小括号括起来)。当使用 allof 或 anyof 测试命令时,有时必须包含小括号,因为它们分别是逻辑“与”和逻辑“或”语句。
示例:
if anyof (size :over 1M, header :contains "subject" ["big file", "mega file"])
{
discard;
}
参数和匹配类型
大多数命令带有一个或多个参数,以便您指定如何操作。参数类型有多种,如位置参数、标记参数和可选参数。举例来说,标记参数和匹配类型参数前加有冒号。:contains、:is、:matches、:over 和 :under 都属于标记参数。某些标记参数仅限于特定命令。有关不同类型参数的更多信息,请参见: RFC-5228。
操作
每一操作必须后接分号,且每一组操作必须包含在大括号内。
示例:
if header :contains ["to", "cc"] "Frank Thomas" {
bayes-learn "spam";
fileinto "spam";
}
Sieve 语言中使用三种控制命令:
require
在脚本开头使用该控制命令来声明在脚本中所用的可选扩展命令。
示例:
require ["securitygateway", "fileinto"];
if / elsif / else
if 命令是核心控制命令。尽管理论上有三条相互关联的命令,但 elsif 和 else 的使用不能独立于 if。当在脚本中遇到 if 命令时,将评估该测试条件以判断它是否为 true。如果为真,则将执行与之相关的操作。
如果 if 测试结果为 false,则评估第一条 elsif 测试。如果 elsif 为 true,则执行与该测试相关的操作。如果 elsif 测试仍为假,则继续对下一条 elsif 进行评估,依次类推,直到其中一条为真。
如果 if 和所有 elsif 测试都为 false,并有一条 else 命令,则将执行该命令的操作。
stop
stop 控制命令终止所有处理。
这些是在 SecurityGateway 的 Sieve 应用中支持的标准测试命令。然而,body 和 envelope 命令是扩展命令,因此每当您希望在脚本中加以使用时,就必须将其包括在 require 控制命令中。此外,在 securitygateway 扩展命令中还包括了大量其他的测试命令,在 SecurityGateway Sieve 扩展命令页上对之作了概述。
address
使用该命令,可以只对报头中的邮件地址而不是可能包含的短语或名称进行测试。例如,如果 "to" 报头包含 "Frank Thomas" <frank@example.com>,那么 header :is "to" "frank@example.com" 的测试结果为 false。但是 address :is "to" "frank@example.com" 的测试结果为真,因为在该评估中只考虑地址。
使用该命令时还有三个可选标记参数: ":localpart",":domain" 和 ":all"。:localpart 参数只评估地址的左半部分(例如 "frank@example.com" 中的 "frank"),:domain 参数只使用地址的域部分(例如 "example.com"),而 :all 使用整个地址。若未包含以上参数,则默认使用 :all。
示例:
require "fileinto";
if address :domain :is "from" "spammer.com" {
fileinto "spam";
}
allof
该测试为逻辑“与”,表示所有的评估条件都必须为真才能执行操作。
示例:
if allof (header :contains "from" "J.Lovell", header :contains "to" "Bubba")
{
fileinto "spam";
}
anyof
该测试为逻辑“或”,表示若评估条件部分为真就能执行相关操作。
示例:
if anyof (size :over 1M, header :contains "subject" "big file attached")
{
reject "I don't want messages that claim to have big files.";
}
body
body 测试命令是可选的扩展命令,因而在要使用它的脚本开头必须添加 require "body" 这个控制命令。该命令比较邮件正文。有关该命令的更多信息,请参阅: Sieve's Body Extension (RFC-5173),
示例:
require ["body", "fileinto"];
if body :text :contains "secret formula" {
fileinto "admin";
}
envelope
envelope 命令是可选的扩展命令,因而在要使用它的脚本开头必须添加 require "envelope" 控制命令。当 "from" 或 "to" 分别用作命令参数时,该命令比较信封部分的 SMTP 发件人和收件人。
示例:
require "envelope";
if envelope :is "from" "MrsFrank@company.com" {
redirect "frankshome@example.com";
}
exists
若邮件中存在参数中所列报头,该测试为真。列出的所有报头必须全都存在,否则该测试为假。
示例:
if exists "x-custom-header" {
redirect "admin@example.com";
}
-and-
if not exists ["from", "date"] {
discard;
}
false
该测试评估结果始终为“FALSE”。
header
当指定报头的数值匹配参数所设置的条件时,该报头测试评估结果为 true。当未指定匹配类型参数时,默认使用 :is。
示例:
require "fileinto"
if header :is "x-custom-header" "01" {
fileinto "admin";
}
not
将该命令随其他测试一起使用意味着测试结果必须求反才能执行该测试的相应操作。例如,测试 if not exists ["from", "date"] { discard; } 表示如果邮件既不包含 "from" 也不包含 "date" 报头,则执行 discard 操作。如果省略 not 命令,则表示当这些报头果真存在时删除该邮件。
size
size 命令接受标记参数 ":over" 和 ":under",且其后必须跟一个数值。该参数用于指定邮件大小必须大于还是小于指定数值才能使测试结果为真。可在数值后使用 M 表示兆字节,K 表示千字节,或不带任何字母表示字节。
示例:
if size :over 500K {
discard;
}
true
该测试评估结果始终为“TRUE”。
spamtest
spamtest 命令是可选的 Sieve 扩展命令,相关论述包含在 Spamtest and VirusTest Extensions (RFC-3685) 这篇文档中,位于 ietf.org。请查看该文档了解有关该扩展命令的信息。
virustest
virustest 命令是可选的 Sieve 扩展命令,相关论述包含在 Spamtest and VirusTest Extensions (RFC-3685) 这篇文档中,位于 ietf.org。请查看该文档了解有关该扩展命令的信息。
这些是 SecurityGateway 支持的标准操作命令。fileinto 和 reject 命令是扩展命令,因此每当您希望在脚本中加以使用时,就必须将其包括在 require 控制命令中。securitygateway 扩展命令中还提供了许多其他操作命令,在 SecurityGateway Sieve 扩展命令 这个页面上对其作了概述。
fileinto
fileinto 操作命令是可选的扩展命令,因而在要使用它的脚本开头必须添加 require "fileinto" 这个控制命令。该命令接受两个参数: "spam" 和 "admin"。"spam" 将邮件移入用户隔离,而 "admin" 将它移入管理员隔离。
示例:
require "fileinto";
if header :contains "from" "Frank Thomas" {
fileinto "spam";
}
discard
该操作导致邮件被自动删除,而不会发送投递状态通知和任何其他消息。
示例:
if size :over 2M { discard; }
keep
该操作导致邮件被保存到默认位置。
redirect
该命令把邮件改投到相关参数中指定的地址,而不会更改邮件正文和现有报头。该命令还支持可选的 :copy 扩展参数,它将邮件的副本发送到指定地址而不是重新投递该邮件。因而在将副本发送到指定地址以外,还可执行其他操作。
示例:
require "copy";
if header :contains "subject" "Response to XYZ" {
redirect :copy "offers@example.com";
bayes-learn "ham";
}
reject
reject 操作命令是可选的扩展命令,因而在要使用它的脚本开头必须添加 require "reject" 控制命令。该命令导致在 SMTP 处理过程中邮件被拒绝,并附带 5xx 响应代码和参数中指定的可选短消息。
require "reject";
if size :over 5M {
reject "No way! This message is too big for me to accept.";
}
vnd.mdaemon.securewebmsg
使用这个操作命令来使用 SecurityGateway 的安全通信 web 门户来发送邮件。
示例:
require ["securitygateway","reject","fileinto","envelope","body","regex"];
if allof(header :matches "subject" "[Secure Message]*")
{
vnd.mdaemon.securewebmsg;
}
拒绝主题中包含 "[SPAM]" 的任何邮件
require "reject";
if header :contains "subject" "[SPAM]"
{
reject "I don't want your spam";
}
拒绝发往特定实名的任何邮件
require ["securitygateway","reject"];
if header :contains "to" "Real Name"
{
bayes-learn "spam";
reject "I don't want your spam";
}
定制贝叶斯自动学习
require ["securitygateway","comparator-i;ascii-numeric"];
if whitelisted
{
bayes-learn "ham";
}
elsif anyof(blacklisted,spamtotal :value "gt" :comparator "i;ascii-numeric" "20.0")
{
bayes-learn "spam";
}
Greylist DNSBL 匹配
require ["securitygateway"];
if not lookup "rblip" "all" {greylist;}
收到大型邮件时通知管理员
require ["securitygateway"];
if size :over 1M
{
alert text:
收件人: admin@company.mail
发件人: postmaster@$RECIPIENTDOMAIN$
主题: SecurityGateway 内容过滤器邮件
X-Attach-Msg: No
$RECIPIENT$ 收到超过 1MB 的邮件。
.
;
}
当主题以“[Secure Message]”开头时作为安全邮件发送
require ["securitygateway","reject","fileinto","envelope","body","regex"];
if allof(header :matches "subject" "[Secure Message]*")
{
vnd.mdaemon.securewebmsg;
}