draft-ietf-sieve-variables-00.txt   draft-ietf-sieve-variables-01.txt 
Network Working Group K. T. Homme Network Working Group K. T. Homme
Updates: 3028 Updates: 3028
Document: draft-ietf-sieve-variables-00.txt University of Oslo Document: draft-ietf-sieve-variables-01.txt University of Oslo
Expires May 15, 2005 Nov 2004 Expires Aug 3, 2005 3 Feb 2005
Sieve Mail Filtering Language: Variables Extension Sieve Mail Filtering Language: Variables Extension
Status of this Memo Status of this Memo
This document is an Internet-Draft and is subject to all provisions This document is an Internet-Draft and is subject to all provisions
of section 3 of RFC 3667. By submitting this Internet-Draft, each of section 3 of RFC 3667. By submitting this Internet-Draft, each
author represents that any applicable patent or other IPR claims of author represents that any applicable patent or other IPR claims of
which he or she is aware have been or will be disclosed, and any of which he or she is aware have been or will be disclosed, and any of
which he or she become aware will be disclosed, in accordance with which he or she become aware will be disclosed, in accordance with
skipping to change at page 2, line 5 skipping to change at page 2, line 5
Distribution of this memo is unlimited. Distribution of this memo is unlimited.
Abstract Abstract
In advanced filtering rule sets, it is useful to keep state or In advanced filtering rule sets, it is useful to keep state or
configuration details across rules. This extension changes the configuration details across rules. This extension changes the
interpretation of strings, adds an action to store data in variables, interpretation of strings, adds an action to store data in variables,
and supplies a new test so that the value of a string can be and supplies a new test so that the value of a string can be
examined. examined.
1. Meta-information on this draft 0. Meta-information on this draft
This information is intended to facilitate discussion. It will be This information is intended to facilitate discussion. It will be
removed when this document leaves the Internet-Draft stage. removed when this document leaves the Internet-Draft stage.
1.1. Discussion 0.1. Discussion
This draft is intended to be an extension to the Sieve mail filtering This draft is intended to be an extension to the Sieve mail filtering
language, available from the RFC repository as language, available from the RFC repository as
<ftp://ftp.ietf.org/rfc/rfc3028.txt>. <ftp://ftp.ietf.org/rfc/rfc3028.txt>.
This draft and the Sieve language itself are being discussed on the This draft and the Sieve language itself are being discussed on the
MTA Filters mailing list at <ietf-mta-filters@imc.org>. Subscription MTA Filters mailing list at <ietf-mta-filters@imc.org>. Subscription
requests can be sent to <ietf-mta-filters-request@imc.org> (send an requests can be sent to <ietf-mta-filters-request@imc.org> (send an
email message with the word "subscribe" in the body). More email message with the word "subscribe" in the body). More
information on the mailing list along with a WWW archive of back information on the mailing list along with a WWW archive of back
messages is available at <http://www.imc.org/ietf-mta-filters/>. messages is available at <http://www.imc.org/ietf-mta-filters/>.
1.2. Noted Changes 0.2. Noted Changes
1.2.1. Changes since -00 0.2.1. Changes since -00
a) allow generic time zone names, without requiring implementations to a) allow generic time zone names, without requiring implementations to
support it. added a "${timezone}" variable so that the user can support it. added a "${timezone}" variable so that the user can
check if the implementation does support the time zone name he check if the implementation does support the time zone name he
wants. the default time zone was changed to localtime again. wants. the default time zone was changed to localtime again.
b) allow back references from :matches as well as :regex. b) allow back references from :matches as well as :regex.
c) added a section on implementation limits. c) added a section on implementation limits.
skipping to change at page 3, line 5 skipping to change at page 3, line 5
f) changed modifiers into being tagged arguments for SET, added f) changed modifiers into being tagged arguments for SET, added
precedence table. precedence table.
g) added optional COMPARATOR to SET to solve the internationalisation g) added optional COMPARATOR to SET to solve the internationalisation
problem with :lower etc. problem with :lower etc.
h) the name of the variable being SET is passed in a string to conform h) the name of the variable being SET is passed in a string to conform
with overall Sieve grammar. this string is explicitly disallowed with overall Sieve grammar. this string is explicitly disallowed
from containing variable references. from containing variable references.
1.2.2. Changes since -01 0.2.2. Changes since -01
a) clarify that a character is a Unicode character. a) clarify that a character is a Unicode character.
b) added paragraph warning against relying on Sieve for virus checking b) added paragraph warning against relying on Sieve for virus checking
to security section. to security section.
c) added a paragraph defining constant string. c) added a paragraph defining constant string.
d) added namespace to grammar. d) added namespace to grammar.
e) removed SETDATE. e) removed SETDATE.
f) added wording and example requiring short-circuiting of test f) added wording and example requiring short-circuiting of test
evaluation. evaluation.
1.2.3. Changes since -02 0.2.3. Changes since -02
a) add references to Unicode and UTF-8, also more boilerplate a) add references to Unicode and UTF-8, also more boilerplate
b) fixed a meaningless example. b) fixed a meaningless example.
c) changed term "numeric variables" to "numbered variables" to reduce c) changed term "numeric variables" to "numbered variables" to reduce
the chance of it being interpreted as variables holding integer the chance of it being interpreted as variables holding integer
values. values.
d) allow future extensions to access the raw string value. d) allow future extensions to access the raw string value.
e) an unsuccessful match does NOT reset the numbered variables. e) an unsuccessful match does NOT reset the numbered variables.
f) added definition of "string :count" f) added definition of "string :count"
g) exceeding implementation limits on variable lengths should not make g) exceeding implementation limits on variable lengths should not make
scripts abort. scripts abort.
1.2.4. Changes since -03 0.2.4. Changes since -03
a) clarify short-circuiting. a) clarify short-circuiting.
b) editorial changes. b) editorial changes.
1.2.4.1. Changes since -04 0.2.5. Changes since -04
a) the wildcards in :matches was changed from greedy to non-greedy to a) the wildcards in :matches was changed from greedy to non-greedy to
better support "principle of least surprise". added example to better support "principle of least surprise". added example to
illustrate the difference. illustrate the difference.
b) add definition of "variable"; clarify grammar is based on [SIEVE]; b) add definition of "variable"; clarify grammar is based on [SIEVE];
clarify role of namespaces; add informative references for [REGEX] clarify role of namespaces; add informative references for [REGEX]
and [SPAMTEST]; add normative reference for [RELATIONAL] and [SPAMTEST]; add normative reference for [RELATIONAL]
c) the use of unsupported numbered variables must be flagged as a c) the use of unsupported numbered variables must be flagged as a
syntax error by implementations. syntax error by implementations.
1.3. Open Issues 0.2.6. Changes since -00 (WG series)
a) added example for string test
b) moved introductory text for MODIFIER from 5.1 into 5.0
c) added Syntax line for MODIFIER.
d) added comment to an example showing that the non-greedy "*" still
matches everything due to implicit anchors.
e) added example of expansion of string with unbalanced braces.
f) updated reference to [SPAMTEST].
0.3. Open Issues
This extension is in conflict with a MUST in [SIEVE] 2.4: "Tests MUST This extension is in conflict with a MUST in [SIEVE] 2.4: "Tests MUST
NOT have side effects." This document therefore can't leave draft NOT have side effects." This document therefore can't leave draft
status until a revised Sieve specification has been accepted by the status until a revised Sieve specification has been accepted by the
IESG. No significant changes to this draft are foreseen before IESG. No significant changes to this draft are foreseen before
submission as a proposed standard. submission as a proposed standard.
2. Introduction 1. Introduction
This is an extension to the Sieve language defined by [SIEVE]. It This is an extension to the Sieve language defined by [SIEVE]. It
adds support for storing and referencing named data. The mechanisms adds support for storing and referencing named data. The mechanisms
detailed in this document will only apply to Sieve scripts that detailed in this document will only apply to Sieve scripts that
include a require clause for the "variables" extension. The require include a require clause for the "variables" extension. The require
clauses themselves are not affected by this extension. clauses themselves are not affected by this extension.
Conventions for notations are as in [SIEVE] section 1.1, including Conventions for notations are as in [SIEVE] section 1.1, including
use of [KEYWORDS] and [ABNF]. The grammar builds on the grammar of use of [KEYWORDS] and [ABNF]. The grammar builds on the grammar of
[SIEVE]. In this document, "character" means a [UNICODE] character, [SIEVE]. In this document, "character" means a [UNICODE] character,
which may consist of multiple octets coded in [UTF-8], and "variable" which may consist of multiple octets coded in [UTF-8], and "variable"
is a named reference to data stored or read back using the mechanisms is a named reference to data stored or read back using the mechanisms
of this extension. of this extension.
3. Capability Identifier 2. Capability Identifier
The capability string associated with the extension defined in this The capability string associated with the extension defined in this
document is "variables". document is "variables".
4. Interpretation of strings 3. Interpretation of strings
This extension changes the semantics of quoted-string, multi-line- This extension changes the semantics of quoted-string, multi-line-
literal and multi-line-dotstuff found in [SIEVE] to enable the literal and multi-line-dotstuff found in [SIEVE] to enable the
inclusion of the value of variables. inclusion of the value of variables.
When a string is evaluated, substrings matching variable-ref SHALL be When a string is evaluated, substrings matching variable-ref SHALL be
replaced by the value of variable-name. Only one pass through the replaced by the value of variable-name. Only one pass through the
string SHALL be done. Variable names are case insensitive, so "foo" string SHALL be done. Variable names are case insensitive, so "foo"
and "FOO" refer to the same variable. Unknown variables are replaced and "FOO" refer to the same variable. Unknown variables are replaced
by the empty string. by the empty string.
skipping to change at page 5, line 26 skipping to change at page 5, line 40
identifier identifier
"${doh!}" => unchanged, as "!" is illegal in identifiers "${doh!}" => unchanged, as "!" is illegal in identifiers
The variable company holds the value "ACME". No other variables The variable company holds the value "ACME". No other variables
are set. are set.
"${full}" => the empty string "${full}" => the empty string
"${company}" => "ACME" "${company}" => "ACME"
"${President, ${Company} Inc.}" "${President, ${Company} Inc.}"
=> "${President, ACME Inc.}" => "${President, ACME Inc.}"
"${BAD${Company}"=>"${BADACME"
The expanded string MUST use the variable values which are current The expanded string MUST use the variable values which are current
when control reaches the statement the string is part of. when control reaches the statement the string is part of.
Strings where no variable substitutions take place are referred to as Strings where no variable substitutions take place are referred to as
constant strings. Future extensions may specify that passing non- constant strings. Future extensions may specify that passing non-
constant strings as arguments to its actions or tests is an error. constant strings as arguments to its actions or tests is an error.
Namespaces are meant for future extensions which make internal state Namespaces are meant for future extensions which make internal state
available through variables. These variables SHOULD be put in a available through variables. These variables SHOULD be put in a
namespace with the same name as its capability string. Notice that namespace with the same name as its capability string. Notice that
the user can not specify a namespace when setting variables with SET. the user can not specify a namespace when setting variables with SET.
Tests or actions in future extensions may need to access the Tests or actions in future extensions may need to access the
unexpanded version of the string argument and, e.g., do the expansion unexpanded version of the string argument and, e.g., do the expansion
after setting variables in its namespace. The design of the after setting variables in its namespace. The design of the
implementation should allow this. implementation should allow this.
4.1. Quoting 3.1. Quoting
The semantics of quoting using backslash are not changed: backslash The semantics of quoting using backslash are not changed: backslash
quoting is resolved before doing variable substitution. quoting is resolved before doing variable substitution.
Examples: Examples:
"${fo\o}" => ${foo} => the expansion of variable foo. "${fo\o}" => ${foo} => the expansion of variable foo.
"${fo\\o}" => ${fo\o} => illegal identifier => left verbatim. "${fo\\o}" => ${fo\o} => illegal identifier => left verbatim.
"\${foo}" => ${foo} => the expansion of variable foo. "\${foo}" => ${foo} => the expansion of variable foo.
"\\${foo}" => \${foo} => a backslash character followed by the "\\${foo}" => \${foo} => a backslash character followed by the
expansion of variable foo. expansion of variable foo.
If it is required to include a character sequence such as "${beep}" If it is required to include a character sequence such as "${beep}"
verbatim in a text literal, the user can define a variable to verbatim in a text literal, the user can define a variable to
circumvent expansion to the empty string. circumvent expansion to the empty string.
Example: Example:
skipping to change at page 6, line 18 skipping to change at page 6, line 33
expansion of variable foo. expansion of variable foo.
If it is required to include a character sequence such as "${beep}" If it is required to include a character sequence such as "${beep}"
verbatim in a text literal, the user can define a variable to verbatim in a text literal, the user can define a variable to
circumvent expansion to the empty string. circumvent expansion to the empty string.
Example: Example:
set "dollar" "$"; set "dollar" "$";
set "text" "regarding ${dollar}{beep}"; set "text" "regarding ${dollar}{beep}";
4.2. Numbered variables 3.2. Numbered variables
The decimal value of the numbered variable name will index the list The decimal value of the numbered variable name will index the list
of matching strings from the most recently evaluated successful match of matching strings from the most recently evaluated successful match
of type ":matches" or ":regex" (see [REGEX]). The list is empty if of type ":matches" or ":regex" (see [REGEX]). The list is empty if
no match has been successful. no match has been successful.
For ":matches", the list will contain one string for each wildcard For ":matches", the list will contain one string for each wildcard
("?" and "*") in the match pattern. Each string holds what the ("?" and "*") in the match pattern. Each string holds what the
corresponding wildcard expands to, possibly the empty string. The corresponding wildcard expands to, possibly the empty string. The
wildcards match as little as possible (non-greedy matching). wildcards match as little as possible (non-greedy matching).
skipping to change at page 7, line 4 skipping to change at page 7, line 21
right. If a test has two or more list arguments, the implementation right. If a test has two or more list arguments, the implementation
is free to choose which to iterate over first. is free to choose which to iterate over first.
Example: Example:
require [ "fileinto", "regex", "variables" ]; require [ "fileinto", "regex", "variables" ];
if header :regex "List-ID" "<(.*)@" { if header :regex "List-ID" "<(.*)@" {
fileinto "lists.${1}"; stop; fileinto "lists.${1}"; stop;
} }
# This usually gives the same result as the above # This usually gives the same result as the above
if header :matches "List-ID" "*<*@*" { if header :matches "List-ID" "*<*@*" {
fileinto "lists.${2}"; stop; fileinto "lists.${2}"; stop;
} }
# Imagine the header # Imagine the header
# Subject: [acme-users] [fwd] version 1.0 is out # Subject: [acme-users] [fwd] version 1.0 is out
if header :regex "Subject" "^[(.*)] (.*)$" { if header :regex "Subject" "^[(.*)] (.*)$" {
# ${1} will hold "acme-users] fwd" # ${1} will hold "acme-users] [fwd"
} }
if header :matches "Subject" "[*] *" { if header :matches "Subject" "[*] *" {
# ${1} will hold "acme-users" # ${1} will hold "acme-users",
# ${2} will hold "[fwd] version 1.0 is out"
fileinfo "lists.${1}"; stop; fileinfo "lists.${1}"; stop;
} }
if address :matches [ "To", "Cc" ] "coyote@**.com" { if address :matches [ "To", "Cc" ] "coyote@**.com" {
# ${0} is always "2", and ${1} is always the empty string. # ${0} is always "2", and ${1} is always the empty string.
fileinto "business.${2}"; stop; fileinto "business.${2}"; stop;
} else { } else {
# Control can't reach this block if any match was # Control can't reach this block if any match was
# successful, so ${0} is always "0" here. # successful, so ${0} is always "0" here.
} }
if anyof (true, address :domain :matches "To" "*.com") { if anyof (true, address :domain :matches "To" "*.com") {
# Second test is never evaluated, so ${0} is still "0" # Second test is never evaluated, so ${0} is still "0"
stop; stop;
} }
5. Action set 4. Action set
Syntax: set [MODIFIER] [COMPARATOR] <name: string> <value: string> Syntax: set [MODIFIER] [COMPARATOR] <name: string> <value: string>
The "set" action stores the specified value in the variable The "set" action stores the specified value in the variable
identified by name. The name MUST be a constant string and conform identified by name. The name MUST be a constant string and conform
to the syntax of identifier. An illegal name MUST cause a syntax to the syntax of identifier. An illegal name MUST cause a syntax
error. error.
Modifiers are applied on a value before it is stored in the variable.
See next section for details.
The default comparator is "i;ascii-casemap". The comparator only The default comparator is "i;ascii-casemap". The comparator only
affects the result when certain modifiers are used. affects the result when certain modifiers are used.
All variables have global scope: they are visible until processing All variables have global scope: they are visible until processing
stops. Variable names are case insensitive. stops. Variable names are case insensitive.
Example: Example:
set "honorific" "Mr"; set "honorific" "Mr";
set "first_name" "Wile"; set "first_name" "Wile";
set "last_name" "Coyote"; set "last_name" "Coyote";
set "vacation" text: set "vacation" text:
Dear ${HONORIFIC} ${last_name}, Dear ${HONORIFIC} ${last_name},
I'm out, please leave a message after the meep. I'm out, please leave a message after the meep.
. .
; ;
"set" does not affect the implicit keep. "set" does not affect the implicit keep.
5.1. Modifiers 4.1. Modifiers
Syntax: ":lower" / ":upper" / ":lowerfirst" / ":upperfirst" /
":length"
Modifiers are applied on a value before it is stored in the variable.
Modifier names are case insensitive. Unknown modifiers MUST yield a Modifier names are case insensitive. Unknown modifiers MUST yield a
syntax error. More than one modifier can be specified, in which case syntax error. More than one modifier can be specified, in which case
they are applied according to this precedence list, highest value they are applied according to this precedence list, highest value
first: first:
+-----------------------------+ +-----------------------------+
| Precedence Modifier | | Precedence Modifier |
+-----------------------------+ +-----------------------------+
| 3 :lower | | 3 :lower |
| :upper | | :upper |
skipping to change at page 8, line 42 skipping to change at page 9, line 27
If two or more modifiers of the same precedence are used, they can be If two or more modifiers of the same precedence are used, they can be
applied in any order. applied in any order.
Examples: Examples:
set "a" "juMBlEd lETteRS"; => "juMBlEd lETteRS" set "a" "juMBlEd lETteRS"; => "juMBlEd lETteRS"
set :length "b" "${a}"; => "15" set :length "b" "${a}"; => "15"
set :lower "b" "${a}"; => "jumbled letters" set :lower "b" "${a}"; => "jumbled letters"
set :upperfirst "b" "${a}"; => "JuMBlEd lETteRS" set :upperfirst "b" "${a}"; => "JuMBlEd lETteRS"
set :upperfirst :lower "b" "${a}"; => "Jumbled letters" set :upperfirst :lower "b" "${a}"; => "Jumbled letters"
5.1.1. Modifier ":length" 4.1.1. Modifier ":length"
The value is the decimal number of characters in the expansion, The value is the decimal number of characters in the expansion,
converted to a string. converted to a string.
5.1.2. Case modifiers 4.1.2. Case modifiers
These modifiers change the letters of the text from upper to lower These modifiers change the letters of the text from upper to lower
case or vice versa. The implementation MUST support US-ASCII, but is case or vice versa. The implementation MUST support US-ASCII, but is
not required to handle the entire Unicode repertoire. The comparator not required to handle the entire Unicode repertoire. The comparator
specified SHOULD be consulted to establish which locale to use. specified SHOULD be consulted to establish which locale to use.
5.1.2.1. Modifier ":upper" 4.1.2.1. Modifier ":upper"
All lower case letters are converted to their upper case counterpart. All lower case letters are converted to their upper case counterpart.
5.1.2.2. Modifier ":lower" 4.1.2.2. Modifier ":lower"
All upper case letters are converted to their lower case counterpart. All upper case letters are converted to their lower case counterpart.
5.1.2.3. Modifier ":upperfirst" 4.1.2.3. Modifier ":upperfirst"
The first character of the string is converted to upper case if it is The first character of the string is converted to upper case if it is
a letter and set in lower case. The rest of the string is left a letter and set in lower case. The rest of the string is left
unchanged. unchanged.
5.1.2.4. Modifier ":lowerfirst" 4.1.2.4. Modifier ":lowerfirst"
The first character of the string is converted to lower case if it is The first character of the string is converted to lower case if it is
a letter and set in upper case. The rest of the string is left a letter and set in upper case. The rest of the string is left
unchanged. unchanged.
6. Test string 5. Test string
Syntax: string [MATCH-TYPE] [COMPARATOR] Syntax: string [MATCH-TYPE] [COMPARATOR]
<source: string-list> <key-list: string-list> <source: string-list> <key-list: string-list>
The "string" test evaluates to true if any of the source strings The "string" test evaluates to true if any of the source strings
matches any key. The type of match defaults to ":is". matches any key. The type of match defaults to ":is".
Example:
set "state" "${state} pending";
if string :matches " ${state} " "* pending *" {
# the above test always succeeds
}
The "relational" extension [RELATIONAL] adds a match type called The "relational" extension [RELATIONAL] adds a match type called
":count". The count of a single string is 0 if it is the empty ":count". The count of a single string is 0 if it is the empty
string, or 1 otherwise. The count of a string list is the sum of the string, or 1 otherwise. The count of a string list is the sum of the
counts of the member strings. counts of the member strings.
7. Implementation Limits 6. Implementation Limits
An implementation of this draft MUST support at least 128 distinct An implementation of this draft MUST support at least 128 distinct
variables. The supported length of variable names MUST be at least variables. The supported length of variable names MUST be at least
32 characters. Each variable MUST be able to hold at least 4000 32 characters. Each variable MUST be able to hold at least 4000
characters. Attempts to set the variable to a value larger than what characters. Attempts to set the variable to a value larger than what
the implementation supports SHOULD be reported as an error at the implementation supports SHOULD be reported as an error at
compile-time if possible. If the attempt is discovered during run- compile-time if possible. If the attempt is discovered during run-
time, the value SHOULD be truncated and it MUST NOT be treated as an time, the value SHOULD be truncated and it MUST NOT be treated as an
error. error.
Numbered variables ${1} through ${9} MUST be supported. References Numbered variables ${1} through ${9} MUST be supported. References
to higher indices than the implementation supports MUST be treated as to higher indices than the implementation supports MUST be treated as
a syntax error which SHOULD be discovered at compile-time. a syntax error which SHOULD be discovered at compile-time.
8. Security Considerations 7. Security Considerations
When numbered variables are used, and the author of the script isn't When numbered variables are used, and the author of the script isn't
careful, strings can contain arbitrary values controlled by the careful, strings can contain arbitrary values controlled by the
sender of the e-mail. sender of the e-mail.
The introduction of variables makes advanced decision making easier The introduction of variables makes advanced decision making easier
to write, but since no looping construct is provided, all Sieve to write, but since no looping construct is provided, all Sieve
scripts will terminate in an orderly manner. scripts will terminate in an orderly manner.
Sieve filtering should not be relied on as a security measure against Sieve filtering should not be relied on as a security measure against
hostile e-mail messages. Sieve is designed to do simple, mostly hostile e-mail messages. Sieve is designed to do simple, mostly
static tests, and is not suitable for use as a spam or virus checker, static tests, and is not suitable for use as a spam or virus checker,
where the perpetrator has a motivation to vary the format of the where the perpetrator has a motivation to vary the format of the
email in order to avoid filtering rules. See also [SPAMTEST]. email in order to avoid filtering rules. See also [SPAMTEST].
9. IANA Considerations 8. IANA Considerations
The following template specifies the IANA registration of the The following template specifies the IANA registration of the
variables Sieve extension specified in this document: variables Sieve extension specified in this document:
To: iana@iana.org To: iana@iana.org
Subject: Registration of new Sieve extension Subject: Registration of new Sieve extension
Capability name: variables Capability name: variables
Capability keyword: variables Capability keyword: variables
Capability arguments: N/A Capability arguments: N/A
skipping to change at page 11, line 13 skipping to change at page 11, line 45
Kjetil Torgrim Homme Kjetil Torgrim Homme
University of Oslo University of Oslo
Pb 1080, Blindern Pb 1080, Blindern
NO-0316 OSLO NO-0316 OSLO
E-mail: kjetilho@ifi.uio.no E-mail: kjetilho@ifi.uio.no
This information should be added to the list of sieve extensions This information should be added to the list of sieve extensions
given on http://www.iana.org/assignments/sieve-extensions. given on http://www.iana.org/assignments/sieve-extensions.
10. Acknowledgments 9. Acknowledgments
Thanks to Jutta Degener, Ned Freed, Lawrence Greenfield, Mark E. Thanks to Jutta Degener, Ned Freed, Lawrence Greenfield, Mark E.
Mallett, Peder Stray and Nigel Swinson for valuable feedback. Mallett, Peder Stray and Nigel Swinson for valuable feedback.
11. Author's Address 10. Author's Address
Kjetil T. Homme Kjetil T. Homme
University of Oslo University of Oslo
PO Box 1080 PO Box 1080
0316 Oslo, Norway 0316 Oslo, Norway
Phone: +47 9366 0091 Phone: +47 9366 0091
E-mail: kjetilho@ifi.uio.no E-mail: kjetilho@ifi.uio.no
Appendix A. Normative References Appendix A. Normative References
[ABNF] D. Crocker, Ed., "Augmented BNF for Syntax [ABNF] Crocker, D. and Overell, P., "Augmented BNF for Syntax
Specifications: ABNF", Internet Mail Consortium, RFC Specifications: ABNF", RFC 2234, November 1997
2234, November 1997
[KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate [KEYWORDS] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", Harvard University, RFC 2119, March Requirement Levels", RFC 2119, March 1997.
1997.
[RELATIONAL] [RELATIONAL] Segmuller, W., "Sieve Extension: Relational Tests",
Segmuller, W., "Sieve Extension: Relational Tests", IBM RFC 3431, December 2002
T.J. Watson Research Center, December 2002
[SIEVE] Showalter, T., "Sieve: A Mail Filtering Language", [SIEVE] Showalter, T., "Sieve: A Mail Filtering Language", RFC
Mirapoint, RFC 3028, January 2001. 3028, January 2001.
[UNICODE] The Unicode Consortium, "The Unicode Standard -- [UNICODE] The Unicode Consortium, "The Unicode Standard --
Worldwide Character Encoding -- Version 1.0", Addison- Worldwide Character Encoding -- Version 1.0", Addison-
Wesley, Volume 1, 1991, Volume 2, 1992. Wesley, Volume 1, 1991, Volume 2, 1992.
[UTF-8] Yergeau, F., "UTF-8, a transformation format of Unicode [UTF-8] Yergeau, F., "UTF-8, a transformation format of
and ISO 10646", RFC 2044, October 1996. Unicode and ISO 10646", RFC 2044, October 1996.
A.1 Informative References A.1 Informative References
[REGEX] K. Murchison, "Sieve Email Filtering -- Regular [REGEX] K. Murchison, "Sieve Email Filtering -- Regular
Expression Extension", Work in Progress. Expression Extension", Work in Progress.
[SPAMTEST] C. Daboo, "SIEVE Email Filtering: Spamtest and VirusTest [SPAMTEST] C. Daboo, "SIEVE Email Filtering: Spamtest and
Extensions", Work in Progress. VirusTest Extensions", RFC 3685, February 2004
Appendix B. Intellectual Property Rights Statement Appendix B. Intellectual Property Rights Statement
The IETF takes no position regarding the validity or scope of any The IETF takes no position regarding the validity or scope of any
intellectual property or other rights that might be claimed to intellectual property or other rights that might be claimed to
pertain to the implementation or use of the technology described in pertain to the implementation or use of the technology described in
this document or the extent to which any license under such rights this document or the extent to which any license under such rights
might or might not be available; neither does it represent that it might or might not be available; neither does it represent that it
has made any effort to identify any such rights. Information on the has made any effort to identify any such rights. Information on the
IETF's procedures with respect to rights in standards-track and IETF's procedures with respect to rights in standards-track and
standards-related documentation can be found in BCP-11. Copies of standards-related documentation can be found in BCP-11. Copies of
claims of rights made available for publication and any assurances of claims of rights made available for publication and any assurances of
licenses to be made available, or the result of an attempt made to licenses to be made available, or the result of an attempt made to
obtain a general license or permission for the use of such obtain a general license or permission for the use of such
proprietary rights by implementors or users of this specification can proprietary rights by implementors or users of this specification can
be obtained from the IETF Secretariat. be obtained from the IETF Secretariat.
Appendix C. Full Copyright Statement Appendix C. Full Copyright Statement
Copyright (C) The Internet Society (2004). Copyright (C) The Internet Society (2005).
This document is subject to the rights, licenses and restrictions This document is subject to the rights, licenses and restrictions
contained in BCP 78, and except as set forth therein, the authors contained in BCP 78, and except as set forth therein, the authors
retain all their rights. retain all their rights.
This document and the information contained herein are provided on an This document and the information contained herein are provided on an
"AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
 End of changes. 

This html diff was produced by rfcdiff 1.23, available from http://www.levkowetz.com/ietf/tools/rfcdiff/