From 1a1dc484089b02d2d25c773cc4b9c4d14f3c06a8 Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Tue, 18 Dec 2007 23:41:39 +0100
Subject: [PATCH] Forgot to add new files.

---
 doc/rfc                               | 2522 +++++++++++++++++++++++++
 sieve/tests/encoded-character.sieve   |    1 +
 src/lib-sieve/ext-encoded-character.c |   46 +
 3 files changed, 2569 insertions(+)
 create mode 100644 doc/rfc
 create mode 100644 sieve/tests/encoded-character.sieve
 create mode 100644 src/lib-sieve/ext-encoded-character.c

diff --git a/doc/rfc b/doc/rfc
new file mode 100644
index 000000000..215cb8e71
--- /dev/null
+++ b/doc/rfc
@@ -0,0 +1,2522 @@
+
+
+
+
+
+Network Working Group                                        P. Guenther
+Internet-Draft                                            Sendmail, Inc.
+Intended status: Standards Track                            T. Showalter
+Expires: April 2008                                              Editors
+Obsoletes: 3028 (if approved)                               October 2007
+
+
+                   Sieve: An Email Filtering Language
+                    draft-ietf-sieve-3028bis-13.txt
+
+Status of this Memo
+
+   By submitting this Internet-Draft, each 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 becomes
+   aware will be disclosed, in accordance with Section 6 of BCP 79.
+
+   Internet-Drafts are working documents of the Internet Engineering
+   Task Force (IETF), its areas, and its working groups.  Note that
+   other groups may also distribute working documents as Internet-
+   Drafts.
+
+   Internet-Drafts are draft documents valid for a maximum of six months
+   and may be updated, replaced, or obsoleted by other documents at any
+   time. It is inappropriate to use Internet-Drafts as reference
+   material or to cite them other than as "work in progress."
+
+   The list of current Internet-Drafts can be accessed at
+   http://www.ietf.org/ietf/1id-abstracts.txt
+
+   The list of Internet-Draft Shadow Directories can be accessed at
+   http://www.ietf.org/shadow.html.
+
+   A revised version of this draft document will be submitted to the RFC
+   editor as a Standard Track RFC for the Internet Community.
+   Discussion and suggestions for improvement are requested, and should
+   be sent to ietf-mta-filters@imc.org.  Distribution of this memo is
+   unlimited.
+
+Copyright Notice
+
+   Copyright (C) The IETF Trust (2007).
+
+Abstract
+
+   This document describes a language for filtering email messages at
+   time of final delivery.  It is designed to be implementable on either
+   a mail client or mail server.  It is meant to be extensible, simple,
+
+
+
+Guenther & Showalter         Standards Track                    [Page 1]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   and independent of access protocol, mail architecture, and operating
+   system.  It is suitable for running on a mail server where users may
+   not be allowed to execute arbitrary programs, such as on black box
+   Internet Message Access Protocol (IMAP) servers, as the base language
+   has no variables, loops, or ability to shell out to external
+   programs.
+
+Table of Contents
+
+   1.      Introduction ...........................................   3
+   1.1.     Conventions Used in This Document .....................   4
+   1.2.     Example mail messages .................................   5
+   2.      Design .................................................   6
+   2.1.     Form of the Language ..................................   6
+   2.2.     Whitespace ............................................   6
+   2.3.     Comments ..............................................   6
+   2.4.     Literal Data ..........................................   7
+   2.4.1.   Numbers ...............................................   7
+   2.4.2.   Strings ...............................................   7
+   2.4.2.1. String Lists ..........................................   8
+   2.4.2.2. Headers ...............................................   9
+   2.4.2.3. Addresses .............................................   9
+   2.4.2.4. Encoding characters using "encoded-character" .........  10
+   2.5.     Tests .................................................  11
+   2.5.1.   Test Lists ............................................  11
+   2.6.     Arguments .............................................  11
+   2.6.1.   Positional Arguments ..................................  11
+   2.6.2.   Tagged Arguments ......................................  12
+   2.6.3.   Optional Arguments ....................................  12
+   2.6.4.   Types of Arguments ....................................  12
+   2.7.     String Comparison .....................................  13
+   2.7.1.   Match Type ............................................  13
+   2.7.2.   Comparisons Across Character Sets .....................  14
+   2.7.3.   Comparators ...........................................  15
+   2.7.4.   Comparisons Against Addresses .........................  16
+   2.8.     Blocks ................................................  16
+   2.9.     Commands ..............................................  16
+   2.10.    Evaluation ............................................  17
+   2.10.1.  Action Interaction ....................................  17
+   2.10.2.  Implicit Keep .........................................  17
+   2.10.3.  Message Uniqueness in a Mailbox .......................  18
+   2.10.4.  Limits on Numbers of Actions ..........................  18
+   2.10.5.  Extensions and Optional Features ......................  18
+   2.10.6.  Errors ................................................  19
+   2.10.7.  Limits on Execution ...................................  19
+   3.      Control Commands .......................................  20
+   3.1.     Control if ............................................  20
+   3.2.     Control require .......................................  21
+
+
+
+Guenther & Showalter         Standards Track                    [Page 2]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   3.3.     Control stop ..........................................  21
+   4.      Action Commands ........................................  21
+   4.1.     Action fileinto .......................................  22
+   4.2.     Action redirect .......................................  22
+   4.3.     Action keep ...........................................  23
+   4.4.     Action discard ........................................  24
+   5.      Test Commands ..........................................  24
+   5.1.     Test address ..........................................  25
+   5.2.     Test allof ............................................  25
+   5.3.     Test anyof ............................................  26
+   5.4.     Test envelope .........................................  26
+   5.5.     Test exists ...........................................  27
+   5.6.     Test false ............................................  27
+   5.7.     Test header ...........................................  27
+   5.8.     Test not ..............................................  28
+   5.9.     Test size .............................................  28
+   5.10.    Test true .............................................  29
+   6.      Extensibility ..........................................  29
+   6.1.     Capability String .....................................  29
+   6.2.     IANA Considerations ...................................  30
+   6.2.1.   Template for Capability Registrations .................  30
+   6.2.2.   Handling of Existing Capability Registrations .........  31
+   6.2.3.   Initial Capability Registrations ......................  31
+   6.3.     Capability Transport ..................................  32
+   7.      Transmission ...........................................  32
+   8.      Parsing ................................................  32
+   8.1.     Lexical Tokens ........................................  33
+   8.2.     Grammar ...............................................  35
+   9.      Extended Example .......................................  35
+   10.     Security Considerations ................................  36
+   11.     Acknowledgments ........................................  38
+   12.     Editors' Addresses .....................................  38
+   13.     Normative References ...................................  38
+   14.     Informative References .................................  39
+   15.     Changes from RFC 3028 ..................................  39
+   16.     Full Copyright Statement ...............................  40
+
+1.      Introduction
+
+   This memo documents a language that can be used to create filters for
+   electronic mail.  It is not tied to any particular operating system
+   or mail architecture.  It requires the use of [IMAIL]-compliant
+   messages, but should otherwise generalize to many systems.
+
+   The language is powerful enough to be useful but limited in order to
+   allow for a safe server-side filtering system.  The intention is to
+   make it impossible for users to do anything more complex (and
+   dangerous) than write simple mail filters, along with facilitating
+
+
+
+Guenther & Showalter         Standards Track                    [Page 3]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   the use of GUIs for filter creation and manipulation.  The base
+   language was not designed to be Turing-complete: it does not have a
+   loop control structure or functions.
+
+   Scripts written in Sieve are executed during final delivery, when the
+   message is moved to the user-accessible mailbox.  In systems where
+   the Mail Transfer Agent (MTA) does final delivery, such as
+   traditional Unix mail, it is reasonable to filter when the MTA
+   deposits mail into the user's mailbox.
+
+   There are a number of reasons to use a filtering system.  Mail
+   traffic for most users has been increasing due to increased usage of
+   email, the emergence of unsolicited email as a form of advertising,
+   and increased usage of mailing lists.
+
+   Experience at Carnegie Mellon has shown that if a filtering system is
+   made available to users, many will make use of it in order to file
+   messages from specific users or mailing lists.  However, many others
+   did not make use of the Andrew system's FLAMES filtering language
+   [FLAMES] due to difficulty in setting it up.
+
+   Because of the expectation that users will make use of filtering if
+   it is offered and easy to use, this language has been made simple
+   enough to allow many users to make use of it, but rich enough that it
+   can be used productively.  However, it is expected that GUI-based
+   editors will be the preferred way of editing filters for a large
+   number of users.
+
+1.1.     Conventions Used in This Document
+
+   In the sections of this document that discuss the requirements of
+   various keywords and operators, the following conventions have been
+   adopted.
+
+   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+   document are to be interpreted as described in [KEYWORDS].
+
+   Each section on a command (test, action, or control) has a line
+   labeled "Usage:".  This line describes the usage of the command,
+   including its name and its arguments.  Required arguments are listed
+   inside angle brackets ("<" and ">").  Optional arguments are listed
+   inside square brackets ("[" and "]").  Each argument is followed by
+   its type, so "<key: string>" represents an argument called "key" that
+   is a string.  Literal strings are represented with double-quoted
+   strings.  Alternatives are separated with slashes, and parenthesis
+   are used for grouping, similar to [ABNF].
+
+
+
+
+Guenther & Showalter         Standards Track                    [Page 4]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   In the "Usage:" line, there are three special pieces of syntax that
+   are frequently repeated, MATCH-TYPE, COMPARATOR, and ADDRESS-PART.
+   These are discussed in sections 2.7.1, 2.7.3, and 2.7.4,
+   respectively.
+
+   The formal grammar for these commands is defined in section 10 and is
+   the authoritative reference on how to construct commands, but the
+   formal grammar does not specify the order, semantics, number or types
+   of arguments to commands, nor the legal command names.  The intent is
+   to allow for extension without changing the grammar.
+
+1.2.     Example mail messages
+
+   The following mail messages will be used throughout this document in
+   examples.
+
+   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.com
+   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
+
+
+
+Guenther & Showalter         Standards Track                    [Page 5]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   SEND $5 IN SMALL, UNMARKED BILLS TO THE ADDRESSES BELOW!
+   -----------------------------------------------------------
+
+2.      Design
+
+2.1.     Form of the Language
+
+   The language consists of a set of commands.  Each command consists of
+   a set of tokens delimited by whitespace.  The command identifier is
+   the first token and it is followed by zero or more argument tokens.
+   Arguments may be literal data, tags, blocks of commands, or test
+   commands.
+
+   With the exceptions of strings and comments, the language is limited
+   to US-ASCII characters.  Strings and comments may contain octets
+   outside the US-ASCII range.  Specifically, they will normally be in
+   UTF-8, as specified in [UTF-8].  NUL (US-ASCII 0) is never permitted
+   in scripts, while CR and LF can only appear as the CRLF line ending.
+
+      While this specification permits arbitrary octets to appear in
+      sieve scripts inside strings and comments, this has made it
+      difficult to robustly handle sieve scripts in programs that are
+      sensitive to the encodings used.  The "encoded-character"
+      capability (section 2.4.2.4) provides an alternative means of
+      representing such octets in strings using just US-ASCII
+      characters.  As such, the use of non-UTF-8 text in scripts should
+      be considered a deprecated feature that may be abandoned.
+
+   Tokens other than strings are considered case-insensitive.
+
+2.2.     Whitespace
+
+   Whitespace is used to separate tokens.  Whitespace is made up of
+   tabs, newlines (CRLF, never just CR or LF), and the space character.
+   The amount of whitespace used is not significant.
+
+2.3.     Comments
+
+   Two types of comments are offered.  Comments are semantically
+   equivalent to whitespace and can be used anyplace that whitespace is
+   (with one exception in multi-line strings, as described in the
+   grammar).
+
+   Hash comments begin with a "#" character that is not contained within
+   a string and continue until the next CRLF.
+
+
+
+
+
+
+Guenther & Showalter         Standards Track                    [Page 6]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   Example:  if size :over 100k { # this is a comment
+                discard;
+             }
+
+   Bracketed comments begin with the token "/*" and end with "*/"
+   outside of a string.  Bracketed comments may span multiple lines.
+   Bracketed comments do not nest.
+
+   Example:  if size :over 100K { /* this is a comment
+                this is still a comment */ discard /* this is a comment
+                */ ;
+             }
+
+2.4.     Literal Data
+
+   Literal data means data that is not executed, merely evaluated "as
+   is", to be used as arguments to commands.  Literal data is limited to
+   numbers, strings, and string lists.
+
+2.4.1.   Numbers
+
+   Numbers are given as ordinary decimal numbers.  As a shorthand for
+   expressing larger values, such as message sizes, a suffix of "K",
+   "M", or "G" MAY be appended to indicate a multiple of a power of two.
+   To be comparable with the power-of-two-based versions of SI units
+   that computers frequently use, "K" specifies kibi-, or 1,024 (2^10)
+   times the value of the number; "M" specifies mebi-, or 1,048,576
+   (2^20) times the value of the number; and "G" specifies gibi-, or
+   1,073,741,824 (2^30) times the value of the number [BINARY-SI].
+
+   Implementations MUST support integer values in the inclusive range
+   zero to 2,147,483,647 (2^31 - 1), but MAY support larger values.
+
+   Only non-negative integers are permitted by this specification.
+
+2.4.2.   Strings
+
+   Scripts involve large numbers of string values as they are used for
+   pattern matching, addresses, textual bodies, etc.  Typically, short
+   quoted strings suffice for most uses, but a more convenient form is
+   provided for longer strings such as bodies of messages.
+
+   A quoted string starts and ends with a single double quote (the <">
+   character, US-ASCII 34).  A backslash ("\", US-ASCII 92) inside of a
+   quoted string is followed by either another backslash or a double
+   quote.  These two-character sequences represent a single backslash or
+   double quote within the value, respectively.
+
+
+
+
+Guenther & Showalter         Standards Track                    [Page 7]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   Scripts SHOULD NOT escape other characters with a backslash.
+
+   An undefined escape sequence (such as "\a" in a context where "a" has
+   no special meaning) is interpreted as if there were no backslash (in
+   this case, "\a" is just "a"), though that may be changed by
+   extensions.
+
+   Non-printing characters such as tabs, CRLF, and control characters
+   are permitted in quoted strings.  Quoted strings MAY span multiple
+   lines.  An unencoded NUL (US-ASCII 0) is not allowed in strings, see
+   section 2.4.2.4 for how it can be encoded.
+
+   As message header data is converted to [UTF-8] for comparison (see
+   section 2.7.2), most string values will use the UTF-8 encoding.
+   However, implementations MUST accept all strings that match the
+   grammar in section 8.  The ability to use non-UTF-8 encoded strings
+   matches existing practice and has proven to be useful both in tests
+   for invalid data and in arguments containing raw MIME parts for
+   extension actions that generate outgoing messages.
+
+   For entering larger amounts of text, such as an email message, a
+   multi-line form is allowed.  It starts with the keyword "text:",
+   followed by a CRLF, and ends with the sequence of a CRLF, a single
+   period, and another CRLF.  The CRLF before the final period is
+   considered part of the value.  In order to allow the message to
+   contain lines with a single-dot, lines are dot-stuffed.  That is,
+   when composing a message body, an extra `.' is added before each line
+   which begins with a `.'.  When the server interprets the script,
+   these extra dots are removed.  Note that a line that begins with a
+   dot followed by a non-dot character is not interpreted dot-stuffed;
+   that is, ".foo" is interpreted as ".foo".  However, because this is
+   potentially ambiguous, scripts SHOULD be properly dot-stuffed so such
+   lines do not appear.
+
+   Note that a hashed comment or whitespace may occur in between the
+   "text:" and the CRLF, but not within the string itself.  Bracketed
+   comments are not allowed here.
+
+2.4.2.1. String Lists
+
+   When matching patterns, it is frequently convenient to match against
+   groups of strings instead of single strings.  For this reason, a list
+   of strings is allowed in many tests, implying that if the test is
+   true using any one of the strings, then the test is true.
+
+   For instance, the test `header :contains ["To", "Cc"]
+   ["me@example.com", "me00@landru.example.com"]' is true if either a To
+   header or Cc header of the input message contains either of the email
+
+
+
+Guenther & Showalter         Standards Track                    [Page 8]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   addresses "me@example.com" or "me00@landru.example.com".
+
+   Conversely, in any case where a list of strings is appropriate, a
+   single string is allowed without being a member of a list: it is
+   equivalent to a list with a single member.  This means that the test
+   `exists "To"' is equivalent to the test `exists ["To"]'.
+
+2.4.2.2. Headers
+
+   Headers are a subset of strings.  In the Internet Message
+   Specification [IMAIL], each header line is allowed to have whitespace
+   nearly anywhere in the line, including after the field name and
+   before the subsequent colon.  Extra spaces between the header name
+   and the ":" in a header field are ignored.
+
+   A header name never contains a colon.  The "From" header refers to a
+   line beginning "From:" (or "From   :", etc.).  No header will match
+   the string "From:" due to the trailing colon.
+
+   Similarly, no header will match a syntactically invalid header name.
+   An implementation MUST NOT cause an error for syntactically invalid
+   header names in tests.
+
+   Header lines are unfolded as described in [IMAIL] section 2.2.3.
+   Interpretation of header data SHOULD be done according to [MIME3]
+   section 6.2 (see 2.7.2 below for details).
+
+2.4.2.3. Addresses
+
+   A number of commands call for email addresses, which are also a
+   subset of strings.  When these addresses are used in outbound
+   contexts, addresses must be compliant with [IMAIL], but are further
+   constrained within this document.  Using the symbols defined in
+   [IMAIL], section 3, the syntax of an address is:
+
+   sieve-address = addr-spec                ; simple address
+                 / phrase "<" addr-spec ">" ; name & addr-spec
+
+   That is, routes and group syntax are not permitted.  If multiple
+   addresses are required, use a string list.  Named groups are not
+   permitted.
+
+   It is an error for a script to execute an action with a value for use
+   as an outbound address that doesn't match the "sieve-address" syntax.
+
+
+
+
+
+
+
+Guenther & Showalter         Standards Track                    [Page 9]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+2.4.2.4. Encoding characters using "encoded-character"
+
+   When the "encoded-character" extension is in effect, certain
+   character sequences in strings are replaced by their decoded value.
+   This happens after escape sequences are interpreted and dot-
+   unstuffing has been done.  Implementations SHOULD support "encoded-
+   character".
+
+   Arbitrary octets can be embedded in strings by using the syntax
+   encoded-arb-octets.  The sequence is replaced by the octets with the
+   hexadecimal values given by each hex-pair.
+
+   blank                = WSP / CRLF
+   encoded-arb-octets   = "${hex:" hex-pair-seq "}"
+   hex-pair-seq         = *blank hex-pair *(1*blank hex-pair) *blank
+   hex-pair             = 1*2HEXDIG
+
+   It may be inconvenient or undesirable to enter Unicode characters
+   verbatim and for these cases the syntax encoded-unicode-char can be
+   used.  The sequence is replaced by the UTF-8 encoding of the
+   specified Unicode characters, which are identified by the hexadecimal
+   value of unicode-hex.
+
+   encoded-unicode-char = "${unicode:" unicode-hex-seq "}"
+   unicode-hex-seq      = *blank unicode-hex
+                          *(1*blank unicode-hex) *blank
+   unicode-hex          = 1*HEXDIG
+
+   It is an error for a script to use a hexadecimal value that isn't in
+   either the range 0 to D7FF or the range E000 to 10FFFF.  (The range
+   D800 to DFFF is excluded as those character numbers are only used as
+   part of the UTF-16 encoding form and are not applicable to the UTF-8
+   encoding that the syntax here represents.)
+
+   Note: Implementations MUST NOT raise an error for an out of range
+   Unicode value unless the sequence containing it is well-formed
+   according to the grammar.
+
+   The capability string for use with the require command is "encoded-
+   character".
+
+   In the following script, message B is discarded, since the specified
+   test string is equivalent to "$$$".
+
+   Example:  require "encoded-character";
+             if header :contains "Subject" "$${hex:24 24}" {
+                discard;
+             }
+
+
+
+Guenther & Showalter         Standards Track                   [Page 10]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   The following examples demonstrate valid and invalid encodings and
+   how they are handled:
+
+     "$${hex:40}"         -> "$@"
+     "${hex: 40 }"        -> "@"
+     "${HEX: 40}"         -> "@"
+     "${hex:40"           -> "${hex:40"
+     "${hex:400}"         -> "${hex:400}"
+     "${hex:4${hex:30}}"  -> "${hex:40}"
+     "${unicode:40}"      -> "@"
+     "${ unicode:40}"     -> "${ unicode:40}"
+     "${UNICODE:40}"      -> "@"
+     "${UnICoDE:0000040}" -> "@"
+     "${Unicode:40}"      -> "@"
+     "${Unicode:Cool}"    -> "${Unicode:Cool}"
+     "${unicode:200000}"  -> error
+     "${Unicode:DF01}     -> error
+
+2.5.     Tests
+
+   Tests are given as arguments to commands in order to control their
+   actions.  In this document, tests are given to if/elsif to decide
+   which block of code is run.
+
+2.5.1.   Test Lists
+
+   Some tests ("allof" and "anyof", which implement logical "and" and
+   logical "or", respectively) may require more than a single test as an
+   argument.  The test-list syntax element provides a way of grouping
+   tests as a comma separated list in parens.
+
+   Example:  if anyof (not exists ["From", "Date"],
+                   header :contains "from" "fool@example.com") {
+                discard;
+             }
+
+2.6.     Arguments
+
+   In order to specify what to do, most commands take arguments.  There
+   are three types of arguments: positional, tagged, and optional.
+
+   It is an error for a script, on a single command, to use conflicting
+   arguments or to use a tagged or optional argument more than once.
+
+2.6.1.   Positional Arguments
+
+   Positional arguments are given to a command which discerns their
+   meaning based on their order.  When a command takes positional
+
+
+
+Guenther & Showalter         Standards Track                   [Page 11]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   arguments, all positional arguments must be supplied and must be in
+   the order prescribed.
+
+2.6.2.   Tagged Arguments
+
+   This document provides for tagged arguments in the style of
+   CommonLISP.  These are also similar to flags given to commands in
+   most command-line systems.
+
+   A tagged argument is an argument for a command that begins with ":"
+   followed by a tag naming the argument, such as ":contains".  This
+   argument means that zero or more of the next tokens have some
+   particular meaning depending on the argument.  These next tokens may
+   be literal data but they are never blocks.
+
+   Tagged arguments are similar to positional arguments, except that
+   instead of the meaning being derived from the command, it is derived
+   from the tag.
+
+   Tagged arguments must appear before positional arguments, but they
+   may appear in any order with other tagged arguments.  For simplicity
+   of the specification, this is not expressed in the syntax definitions
+   with commands, but they still may be reordered arbitrarily provided
+   they appear before positional arguments.  Tagged arguments may be
+   mixed with optional arguments.
+
+   Tagged arguments SHOULD NOT take tagged arguments as arguments.
+
+2.6.3.   Optional Arguments
+
+   Optional arguments are exactly like tagged arguments except that they
+   may be left out, in which case a default value is implied.  Because
+   optional arguments tend to result in shorter scripts, they have been
+   used far more than tagged arguments.
+
+   One particularly noteworthy case is the ":comparator" argument, which
+   allows the user to specify which comparator [COLLATION] will be used
+   to compare two strings, since different languages may impose
+   different orderings on UTF-8 [UTF-8] strings.
+
+2.6.4.   Types of Arguments
+
+   Abstractly, arguments may be literal data, tests, or blocks of
+   commands.  In this way, an "if" control structure is merely a command
+   that happens to take a test and a block as arguments and may execute
+   the block of code.
+
+   However, this abstraction is ambiguous from a parsing standpoint.
+
+
+
+Guenther & Showalter         Standards Track                   [Page 12]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   The grammar in section 9.2 presents a parsable version of this:
+   Arguments are string-lists, numbers, and tags, which may be followed
+   by a test or a test-list, which may be followed by a block of
+   commands.  No more than one test or test list, nor more than one
+   block of commands, may be used, and commands that end with a block of
+   commands do not end with semicolons.
+
+2.7.     String Comparison
+
+   When matching one string against another, there are a number of ways
+   of performing the match operation.  These are accomplished with three
+   types of matches: an exact match, a substring match, and a wildcard
+   glob-style match.  These are described below.
+
+   In order to provide for matches between character sets and case
+   insensitivity, Sieve uses the comparators defined in the Internet
+   Application Protocol Collation Registry [COLLATION].
+
+   However, when a string represents the name of a header, the
+   comparator is never user-specified.  Header comparisons are always
+   done with the "i;ascii-casemap" operator, i.e., case-insensitive
+   comparisons, because this is the way things are defined in the
+   message specification [IMAIL].
+
+2.7.1.   Match Type
+
+   Commands which perform string comparisons may have an optional match
+   type argument. The three match types in this specification are ":is",
+   ":contains", and ":matches".
+
+   The ":contains" match type describes a substring match.  If the value
+   argument contains the key argument as a substring, the match is true.
+   For instance, the string "frobnitzm" contains "frob" and "nit", but
+   not "fbm".  The empty key ("") is contained in all values.
+
+   The ":is" match type describes an absolute match; if the contents of
+   the first string are absolutely the same as the contents of the
+   second string, they match.  Only the string "frobnitzm" is the string
+   "frobnitzm".  The empty key ":is" and only ":is" the empty value.
+
+   The ":matches" match type specifies a wildcard match using the
+   characters "*" and "?"; the entire value must be matched.  "*"
+   matches zero or more characters in the value and "?" matches a single
+   character in the value, where the comparator that is used (see 2.7.3)
+   defines what a character is.  For example, the comparators "i;octet"
+   and "i;ascii-casemap" define a character to be a single octet so "?"
+   will always match exactly one octet when one of those comparators is
+   in use.  In contrast, a Unicode-based comparator would define a
+
+
+
+Guenther & Showalter         Standards Track                   [Page 13]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   character to be any UTF-8 octet sequence encoding one Unicode
+   character and thus "?" may match more than one octet.  "?" and "*"
+   may be escaped as "\\?" and "\\*" in strings to match against
+   themselves.  The first backslash escapes the second backslash;
+   together, they escape the "*".  This is awkward, but it is
+   commonplace in several programming languages that use globs and
+   regular expressions.
+
+   In order to specify what type of match is supposed to happen,
+   commands that support matching take optional arguments ":matches",
+   ":is", and ":contains".  Commands default to using ":is" matching if
+   no match type argument is supplied.  Note that these modifiers
+   interact with comparators; in particular, only comparators that
+   support the "substring match" operation are suitable for matching
+   with ":contains" or ":matches".  It is an error to use a comparator
+   with ":contains" or ":matches" that is not compatible with it.
+
+   It is an error to give more than one of these arguments to a given
+   command.
+
+   For convenience, the "MATCH-TYPE" syntax element is defined here as
+   follows:
+
+   Syntax:   ":is" / ":contains" / ":matches"
+
+2.7.2.   Comparisons Across Character Sets
+
+   Messages may involve a number of character sets.  In order for
+   comparisons to work across character sets, implementations SHOULD
+   implement the following behavior:
+
+      Comparisons are performed on octets.  Implementations convert text
+      from header fields in all charsets [MIME3] to Unicode, encoded as
+      UTF-8, as input to the comparator (see 2.7.3).  Implementations
+      MUST be capable of converting US-ASCII, ISO-8859-1, the US-ASCII
+      subset of ISO-8859-* character sets, and UTF-8.  Text that the
+      implementation cannot convert to Unicode for any reason MAY be
+      treated as plain US-ASCII (including any [MIME3] syntax) or
+      processed according to local conventions.  An encoded NUL octet
+      (character zero) SHOULD NOT cause early termination of the header
+      content being compared against.
+
+   If implementations fail to support the above behavior, they MUST
+   conform to the following:
+
+      No two strings can be considered equal if one contains octets
+      greater than 127.
+
+
+
+
+Guenther & Showalter         Standards Track                   [Page 14]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+2.7.3.   Comparators
+
+   In order to allow for language-independent, case-independent matches,
+   the match type may be coupled with a comparator name.  The Internet
+   Application Protocol Collation Registry [COLLATION] provides the
+   framework for describing and naming comparators.
+
+   All implementations MUST support the "i;octet" comparator (simply
+   compares octets) and the "i;ascii-casemap" comparator (which treats
+   uppercase and lowercase characters in the US-ASCII subset of UTF-8 as
+   the same).  If left unspecified, the default is "i;ascii-casemap".
+
+   Some comparators may not be usable with substring matches; that is,
+   they may only work with ":is".  It is an error to try and use a
+   comparator with ":matches" or ":contains" that is not compatible with
+   it.
+
+   Sieve treats a comparator result of "undefined" the same as a result
+   of "no-match".  That is, this base specification does not provide any
+   means to directly detect invalid comparator input.
+
+   A comparator is specified by the ":comparator" option with commands
+   that support matching.  This option is followed by a string providing
+   the name of the comparator to be used.  For convenience, the syntax
+   of a comparator is abbreviated to "COMPARATOR", and (repeated in
+   several tests) is as follows:
+
+   Syntax:   ":comparator" <comparator-name: string>
+
+   So in this example,
+
+   Example:  if header :contains :comparator "i;octet" "Subject"
+                   "MAKE MONEY FAST" {
+                discard;
+             }
+
+   would discard any message with subjects like "You can MAKE MONEY
+   FAST", but not "You can Make Money Fast", since the comparator used
+   is case-sensitive.
+
+   Comparators other than "i;octet" and "i;ascii-casemap" must be
+   declared with require, as they are extensions.  If a comparator
+   declared with require is not known, it is an error, and execution
+   fails.  If the comparator is not declared with require, it is also an
+   error, even if the comparator is supported.  (See 2.10.5.)
+
+   Both ":matches" and ":contains" match types are compatible with the
+   "i;octet" and "i;ascii-casemap" comparators and may be used with
+
+
+
+Guenther & Showalter         Standards Track                   [Page 15]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   them.
+
+   It is an error to give more than one of these arguments to a given
+   command.
+
+2.7.4.   Comparisons Against Addresses
+
+   Addresses are one of the most frequent things represented as strings.
+   These are structured, and being able to compare against the local-
+   part or the domain of an address is useful, so some tests that act
+   exclusively on addresses take an additional optional argument that
+   specifies what the test acts on.
+
+   These optional arguments are ":localpart", ":domain", and ":all",
+   which act on the local-part (left-side), the domain part (right-
+   side), and the whole address.
+
+   If an address is not syntactically valid then it will not be matched
+   by tests specifying ":localpart" or ":domain".
+
+   The kind of comparison done, such as whether or not the test done is
+   case-insensitive, is specified as a comparator argument to the test.
+
+   If an optional address-part is omitted, the default is ":all".
+
+   It is an error to give more than one of these arguments to a given
+   command.
+
+   For convenience, the "ADDRESS-PART" syntax element is defined here as
+   follows:
+
+   Syntax:   ":localpart" / ":domain" / ":all"
+
+2.8.     Blocks
+
+   Blocks are sets of commands enclosed within curly braces and supplied
+   as the final argument to a command.  Such a command is a control
+   structure: when executed it has control over the number of times the
+   commands in the block are executed.
+
+   With the commands supplied in this memo, there are no loops.  The
+   control structures supplied--if, elsif, and else--run a block either
+   once or not at all.
+
+2.9.     Commands
+
+   Sieve scripts are sequences of commands.  Commands can take any of
+   the tokens above as arguments, and arguments may be either tagged or
+
+
+
+Guenther & Showalter         Standards Track                   [Page 16]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   positional arguments.  Not all commands take all arguments.
+
+   There are three kinds of commands: test commands, action commands,
+   and control commands.
+
+   The simplest is an action command.  An action command is an
+   identifier followed by zero or more arguments, terminated by a
+   semicolon.  Action commands do not take tests or blocks as arguments.
+   The actions referenced in this document are:
+    - keep, to save the message in the default location
+    - fileinto, to save the message in a specific mailbox
+    - redirect, to forward the message to another address,
+    - discard, to silently throw away the message
+
+   A control command is a command that affects the parsing or the flow
+   of execution of the Sieve script in some way.  A control structure is
+   a control command which ends with a block instead of a semicolon.
+
+   A test command is used as part of a control command.  It is used to
+   specify whether or not the block of code given to the control command
+   is executed.
+
+2.10.    Evaluation
+
+2.10.1.  Action Interaction
+
+   Some actions cannot be used with other actions because the result
+   would be absurd.  These restrictions are noted throughout this memo.
+
+   Extension actions MUST state how they interact with actions defined
+   in this specification.
+
+2.10.2.  Implicit Keep
+
+   Previous experience with filtering systems suggests that cases tend
+   to be missed in scripts.  To prevent errors, Sieve has an "implicit
+   keep".
+
+   An implicit keep is a keep action (see 4.4) performed in absence of
+   any action that cancels the implicit keep.
+
+   An implicit keep is performed if a message is not written to a
+   mailbox, redirected to a new address, or explicitly thrown out.  That
+   is, if a fileinto, a keep, a redirect, or a discard is performed, an
+   implicit keep is not.
+
+   Some actions may be defined to not cancel the implicit keep.  These
+   actions may not directly affect the delivery of a message, and are
+
+
+
+Guenther & Showalter         Standards Track                   [Page 17]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   used for their side effects.  None of the actions specified in this
+   document meet that criteria, but extension actions may.
+
+   For instance, with any of the short messages offered above, the
+   following script produces no actions.
+
+   Example:  if size :over 500K { discard; }
+
+   As a result, the implicit keep is taken.
+
+2.10.3.  Message Uniqueness in a Mailbox
+
+   Implementations SHOULD NOT deliver a message to the same mailbox more
+   than once, even if a script explicitly asks for a message to be
+   written to a mailbox twice.
+
+   The test for equality of two messages is implementation-defined.
+
+   If a script asks for a message to be written to a mailbox twice, it
+   MUST NOT be treated as an error.
+
+2.10.4.  Limits on Numbers of Actions
+
+   Site policy MAY limit the number of actions taken and MAY impose
+   restrictions on which actions can be used together.  In the event
+   that a script hits a policy limit on the number of actions taken for
+   a particular message, an error occurs.
+
+   Implementations MUST allow at least one keep or one fileinto.  If
+   fileinto is not implemented, implementations MUST allow at least one
+   keep.
+
+2.10.5.  Extensions and Optional Features
+
+   Because of the differing capabilities of many mail systems, several
+   features of this specification are optional.  Before any of these
+   extensions can be executed, they must be declared with the "require"
+   action.
+
+   If an extension is not enabled with "require", implementations MUST
+   treat it as if they did not support it at all.  This protects scripts
+   from having their behavior altered by extensions which the script
+   author might not have even been aware of.
+
+   Implementations MUST NOT execute any Sieve script test or command
+   subsequent to "require" if one of the required extensions is
+   unavailable.
+
+
+
+
+Guenther & Showalter         Standards Track                   [Page 18]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   Note: The reason for this restriction is that prior experiences with
+         languages such as LISP and Tcl suggest that this is a workable
+         way of noting that a given script uses an extension.
+
+   Extensions which define actions MUST state how they interact with
+   actions discussed in the base specification.
+
+2.10.6.  Errors
+
+   In any programming language, there are compile-time and run-time
+   errors.
+
+   Compile-time errors are ones in syntax that are detectable if a
+   syntax check is done.
+
+   Run-time errors are not detectable until the script is run.  This
+   includes transient failures like disk full conditions, but also
+   includes issues like invalid combinations of actions.
+
+   When an error occurs in a Sieve script, all processing stops.
+
+   Implementations MAY choose to do a full parse, then evaluate the
+   script, then do all actions.  Implementations might even go so far as
+   to ensure that execution is atomic (either all actions are executed
+   or none are executed).
+
+   Other implementations may choose to parse and run at the same time.
+   Such implementations are simpler, but have issues with partial
+   failure (some actions happen, others don't).
+
+   Implementations MUST perform syntactic, semantic, and run-time checks
+   on code that is actually executed.  Implementations MAY perform those
+   checks or any part of them on code that is not reached during
+   execution.
+
+   When an error happens, implementations MUST notify the user that an
+   error occurred, which actions (if any) were taken, and do an implicit
+   keep.
+
+2.10.7.  Limits on Execution
+
+   Implementations may limit certain constructs.  However, this
+   specification places a lower bound on some of these limits.
+
+   Implementations MUST support fifteen levels of nested blocks.
+
+   Implementations MUST support fifteen levels of nested test lists.
+
+
+
+
+Guenther & Showalter         Standards Track                   [Page 19]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+3.      Control Commands
+
+   Control structures are needed to allow for multiple and conditional
+   actions.
+
+3.1.     Control if
+
+   There are three pieces to if: "if", "elsif", and "else".  Each is
+   actually a separate command in terms of the grammar.  However, an
+   elsif or else MUST only follow an if or elsif.  An error occurs if
+   these conditions are not met.
+
+   Usage:   if <test1: test> <block1: block>
+
+   Usage:   elsif <test2: test> <block2: block>
+
+   Usage:   else <block3: block>
+
+   The semantics are similar to those of any of the many other
+   programming languages these control structures appear in.  When the
+   interpreter sees an "if", it evaluates the test associated with it.
+   If the test is true, it executes the block associated with it.
+
+   If the test of the "if" is false, it evaluates the test of the first
+   "elsif" (if any).  If the test of "elsif" is true, it runs the
+   elsif's block.  An elsif may be followed by an elsif, in which case,
+   the interpreter repeats this process until it runs out of elsifs.
+
+   When the interpreter runs out of elsifs, there may be an "else" case.
+   If there is, and none of the if or elsif tests were true, the
+   interpreter runs the else's block.
+
+   This provides a way of performing exactly one of the blocks in the
+   chain.
+
+   In the following example, both Message A and B are dropped.
+
+   Example:  require "fileinto";
+             if header :contains "from" "coyote" {
+                discard;
+             } elsif header :contains ["subject"] ["$$$"] {
+                discard;
+             } else {
+                fileinto "INBOX";
+             }
+
+
+   When the script below is run over message A, it redirects the message
+
+
+
+Guenther & Showalter         Standards Track                   [Page 20]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   to acm@example.com; message B, to postmaster@example.com; any other
+   message is redirected to field@example.com.
+
+   Example:  if header :contains ["From"] ["coyote"] {
+                redirect "acm@example.com";
+             } elsif header :contains "Subject" "$$$" {
+                redirect "postmaster@example.com";
+             } else {
+                redirect "field@example.com";
+             }
+
+   Note that this definition prohibits the "... else if ..." sequence
+   used by C.  This is intentional, because this construct produces a
+   shift-reduce conflict.
+
+3.2.     Control require
+
+   Usage:   require <capabilities: string-list>
+
+   The require action notes that a script makes use of a certain
+   extension.  Such a declaration is required to use the extension, as
+   discussed in section 2.10.5.  Multiple capabilities can be declared
+   with a single require.
+
+   The require command, if present, MUST be used before anything other
+   than a require can be used.  An error occurs if a require appears
+   after a command other than require.
+
+   Example:  require ["fileinto", "reject"];
+
+   Example:  require "fileinto";
+             require "vacation";
+
+3.3.     Control stop
+
+   Usage:   stop
+
+   The "stop" action ends all processing.  If the implicit keep has not
+   been cancelled, then it is taken.
+
+4.      Action Commands
+
+   This document supplies four actions that may be taken on a message:
+   keep, fileinto, redirect, and discard.
+
+   Implementations MUST support the "keep", "discard", and "redirect"
+   actions.
+
+
+
+
+Guenther & Showalter         Standards Track                   [Page 21]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   Implementations SHOULD support "fileinto".
+
+   Implementations MAY limit the number of certain actions taken (see
+   section 2.10.4).
+
+4.1.     Action fileinto
+
+   Usage:   fileinto <mailbox: string>
+
+   The "fileinto" action delivers the message into the specified
+   mailbox.  Implementations SHOULD support fileinto, but in some
+   environments this may be impossible.  Implementations MAY place
+   restrictions on mailbox names; use of an invalid mailbox name MAY be
+   treated as an error or result in delivery to an implementation-
+   defined mailbox.  If the specified mailbox doesn't exist, the
+   implementation MAY treat it as an error, create the mailbox, or
+   deliver the message to an implementation-defined mailbox.  If the
+   implementation uses a different encoding scheme than UTF-8 for
+   mailbox names, it SHOULD reencode the mailbox name from UTF-8 to its
+   encoding scheme.  For example, the Internet Message Access Protocol
+   [IMAP] uses modified UTF-7, such that a mailbox argument of "odds &
+   ends" would appear in IMAP as "odds &- ends".
+
+   The capability string for use with the require command is "fileinto".
+
+   In the following script, message A is filed into mailbox
+   "INBOX.harassment".
+
+   Example:  require "fileinto";
+             if header :contains ["from"] "coyote" {
+                fileinto "INBOX.harassment";
+             }
+
+4.2.     Action redirect
+
+   Usage:   redirect <address: string>
+
+   The "redirect" action is used to send the message to another user at
+   a supplied address, as a mail forwarding feature does.  The
+   "redirect" action makes no changes to the message body or existing
+   headers, but it may add new headers.  In particular, existing
+   Received headers MUST be preserved and the count of Received headers
+   in the outgoing message MUST be larger than the same count on the
+   message as received by the implementation.  (An implementation that
+   adds a Received header before processing the message does not need to
+   add another when redirecting.)
+
+   The message is sent back out with the address from the redirect
+
+
+
+Guenther & Showalter         Standards Track                   [Page 22]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   command as an envelope recipient.  Implementations MAY combine
+   separate redirects for a given message into a single submission with
+   multiple envelope recipients.  (This is not an MUA-style forward,
+   which creates a new message with a different sender and message ID,
+   wrapping the old message in a new one.)
+
+   The envelope sender address on the outgoing message is chosen by the
+   sieve implementation. It MAY be copied from the message being
+   processed. However, if the message being processed has an empty
+   envelope sender address the outgoing message MUST also have an empty
+   envelope sender address. This last requirement is imposed to prevent
+   loops in the case where a message is redirected to an invalid address
+   when then returns a delivery status notification that also ends up
+   being redirected to the same invalid address.
+
+   The envelope sender address on the outgoing message is chosen by the
+   sieve implementation.  It MAY be copied from the message being
+   processed.
+
+   A simple script can be used for redirecting all mail:
+
+   Example:  redirect "bart@example.com";
+
+   Implementations MUST take measures to implement loop control,
+   possibly including adding headers to the message or counting Received
+   headers as specified in section 6.2 of [SMTP].  If an implementation
+   detects a loop, it causes an error.
+
+   Implementations MUST provide means of limiting the number of
+   redirects a Sieve script can perform. See Section 10 for more
+   details.
+
+   Implementations MAY ignore a redirect action silently due to policy
+   reasons.  For example, an implementation MAY choose not to redirect
+   to an address that is known to be undeliverable. Any ignored redirect
+   MUST NOT cancel the implicit keep.
+
+4.3.     Action keep
+
+   Usage:   keep
+
+   The "keep" action is whatever action is taken in lieu of all other
+   actions, if no filtering happens at all; generally, this simply means
+   to file the message into the user's main mailbox.  This command
+   provides a way to execute this action without needing to know the
+   name of the user's main mailbox, providing a way to call it without
+   needing to understand the user's setup, or the underlying mail
+   system.
+
+
+
+Guenther & Showalter         Standards Track                   [Page 23]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   For instance, in an implementation where the IMAP server is running
+   scripts on behalf of the user at time of delivery, a keep command is
+   equivalent to a fileinto "INBOX".
+
+   Example:  if size :under 1M { keep; } else { discard; }
+
+   Note that the above script is identical to the one below.
+
+   Example:  if not size :under 1M { discard; }
+
+4.4.     Action discard
+
+   Usage:   discard
+
+   Discard is used to silently throw away the message.  It does so by
+   simply canceling the implicit keep.  If discard is used with other
+   actions, the other actions still happen.  Discard is compatible with
+   all other actions.  (For instance fileinto+discard is equivalent to
+   fileinto.)
+
+   Discard MUST be silent; that is, it MUST NOT return a non-delivery
+   notification of any kind ([DSN], [MDN], or otherwise).
+
+   In the following script, any mail from "idiot@example.com" is thrown
+   out.
+
+   Example:  if header :contains ["from"] ["idiot@example.com"] {
+                discard;
+             }
+
+   While an important part of this language, "discard" has the potential
+   to create serious problems for users: Students who leave themselves
+   logged in to an unattended machine in a public computer lab may find
+   their script changed to just "discard".  In order to protect users in
+   this situation (along with similar situations), implementations MAY
+   keep messages destroyed by a script for an indefinite period, and MAY
+   disallow scripts that throw out all mail.
+
+5.      Test Commands
+
+   Tests are used in conditionals to decide which part(s) of the
+   conditional to execute.
+
+   Implementations MUST support these tests: "address", "allof",
+   "anyof", "exists", "false", "header", "not", "size", and "true".
+
+   Implementations SHOULD support the "envelope" test.
+
+
+
+
+Guenther & Showalter         Standards Track                   [Page 24]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+5.1.     Test address
+
+   Usage:   address [COMPARATOR] [ADDRESS-PART] [MATCH-TYPE]
+            <header-list: string-list> <key-list: string-list>
+
+   The "address" test matches Internet addresses in structured headers
+   that contain addresses.  It returns true if any header contains any
+   key in the specified part of the address, as modified by the
+   comparator and the match keyword.  Whether there are other addresses
+   present in the header doesn't affect this test; this test does not
+   provide any way to determine whether an address is the only address
+   in a header.
+
+   Like envelope and header, this test returns true if any combination
+   of the header-list and key-list arguments match and false otherwise.
+
+   Internet email addresses [IMAIL] have the somewhat awkward
+   characteristic that the local-part to the left of the at-sign is
+   considered case sensitive, and the domain-part to the right of the
+   at-sign is case insensitive.  The "address" command does not deal
+   with this itself, but provides the ADDRESS-PART argument for allowing
+   users to deal with it.
+
+   The address primitive never acts on the phrase part of an email
+   address, nor on comments within that address.  It also never acts on
+   group names, although it does act on the addresses within the group
+   construct.
+
+   Implementations MUST restrict the address test to headers that
+   contain addresses, but MUST include at least From, To, Cc, Bcc,
+   Sender, Resent-From, Resent-To, and SHOULD include any other header
+   that utilizes an "address-list" structured header body.
+
+   Example:  if address :is :all "from" "tim@example.com" {
+                discard;
+             }
+
+5.2.     Test allof
+
+   Usage:   allof <tests: test-list>
+
+   The "allof" test performs a logical AND on the tests supplied to it.
+
+   Example:  allof (false, false)  =>   false
+             allof (false, true)   =>   false
+             allof (true,  true)   =>   true
+
+   The allof test takes as its argument a test-list.
+
+
+
+Guenther & Showalter         Standards Track                   [Page 25]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+5.3.     Test anyof
+
+   Usage:   anyof <tests: test-list>
+
+   The "anyof" test performs a logical OR on the tests supplied to it.
+
+   Example:  anyof (false, false)  =>   false
+             anyof (false, true)   =>   true
+             anyof (true,  true)   =>   true
+
+5.4.     Test envelope
+
+   Usage:   envelope [COMPARATOR] [ADDRESS-PART] [MATCH-TYPE]
+            <envelope-part: string-list> <key-list: string-list>
+
+   The "envelope" test is true if the specified part of the [SMTP] (or
+   equivalent) envelope matches the specified key.  This specification
+   defines the interpretation of the (case insensitive) "from" and "to"
+   envelope-parts.  Additional envelope-parts may be defined by other
+   extensions; implementations SHOULD consider unknown envelope parts an
+   error.
+
+   If one of the envelope-part strings is (case insensitive) "from",
+   then matching occurs against the FROM address used in the SMTP MAIL
+   command.  The null reverse-path is matched against as the empty
+   string, regardless of the ADDRESS-PART argument specified.
+
+   If one of the envelope-part strings is (case insensitive) "to", then
+   matching occurs against the TO address used in the SMTP RCPT command
+   that resulted in this message getting delivered to this user.  Note
+   that only the most recent TO is available, and only the one relevant
+   to this user.
+
+   The envelope-part is a string list and may contain more than one
+   parameter, in which case all of the strings specified in the key-list
+   are matched against all parts given in the envelope-part list.
+
+   Like address and header, this test returns true if any combination of
+   the envelope-part list and key-list arguments match and false
+   otherwise.
+
+   All tests against envelopes MUST drop source routes.
+
+   If the SMTP transaction involved several RCPT commands, only the data
+   from the RCPT command that caused delivery to this user is available
+   in the "to" part of the envelope.
+
+   If a protocol other than SMTP is used for message transport,
+
+
+
+Guenther & Showalter         Standards Track                   [Page 26]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   implementations are expected to adapt this command appropriately.
+
+   The envelope command is optional.  Implementations SHOULD support it,
+   but the necessary information may not be available in all cases.  The
+   capability string for use with the require command is "envelope".
+
+   Example:  require "envelope";
+             if envelope :all :is "from" "tim@example.com" {
+                discard;
+             }
+
+5.5.     Test exists
+
+   Usage:   exists <header-names: string-list>
+
+   The "exists" test is true if the headers listed in the header-names
+   argument exist within the message.  All of the headers must exist or
+   the test is false.
+
+   The following example throws out mail that doesn't have a From header
+   and a Date header.
+
+   Example:  if not exists ["From","Date"] {
+                discard;
+             }
+
+5.6.     Test false
+
+   Usage:   false
+
+   The "false" test always evaluates to false.
+
+5.7.     Test header
+
+   Usage:   header [COMPARATOR] [MATCH-TYPE]
+            <header-names: string-list> <key-list: string-list>
+
+   The "header" test evaluates to true if the value of any of the named
+   headers, ignoring leading and trailing whitespace, matches any key.
+   The type of match is specified by the optional match argument, which
+   defaults to ":is" if not specified, as specified in section 2.6.
+
+   Like address and envelope, this test returns true if any combination
+   of the header-names list and key-list arguments match and false
+   otherwise.
+
+   If a header listed in the header-names argument exists, it contains
+   the empty key ("").  However, if the named header is not present, it
+
+
+
+Guenther & Showalter         Standards Track                   [Page 27]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   does not match any key, including the empty key.  So if a message
+   contained the header
+
+           X-Caffeine: C8H10N4O2
+
+   these tests on that header evaluate as follows:
+
+           header :is ["X-Caffeine"] [""]         => false
+           header :contains ["X-Caffeine"] [""]   => true
+
+   Testing whether a given header is either absent or doesn't contain
+   any non-whitespace characters can be done using a negated "header"
+   test:
+
+           not header :matches "Cc" "?*"
+
+5.8.     Test not
+
+   Usage:   not <test1: test>
+
+   The "not" test takes some other test as an argument, and yields the
+   opposite result.  "not false" evaluates to "true" and "not true"
+   evaluates to "false".
+
+5.9.     Test size
+
+   Usage:   size <":over" / ":under"> <limit: number>
+
+   The "size" test deals with the size of a message.  It takes either a
+   tagged argument of ":over" or ":under", followed by a number
+   representing the size of the message.
+
+   If the argument is ":over", and the size of the message is greater
+   than the number provided, the test is true; otherwise, it is false.
+
+   If the argument is ":under", and the size of the message is less than
+   the number provided, the test is true; otherwise, it is false.
+
+   Exactly one of ":over" or ":under" must be specified, and anything
+   else is an error.
+
+   The size of a message is defined to be the number of octets in the
+   [IMAIL] representation of the message.
+
+   Note that for a message that is exactly 4,000 octets, the message is
+   neither ":over" nor ":under" 4000 octets.
+
+
+
+
+
+Guenther & Showalter         Standards Track                   [Page 28]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+5.10.    Test true
+
+   Usage:   true
+
+   The "true" test always evaluates to true.
+
+6.      Extensibility
+
+   New control commands, actions, and tests can be added to the
+   language.  Sites must make these features known to their users; this
+   document does not define a way to discover the list of extensions
+   supported by the server.
+
+   Any extensions to this language MUST define a capability string that
+   uniquely identifies that extension.  Capability string are case-
+   sensitive; for example, "foo" and "FOO" are different capabilities.
+   If a new version of an extension changes the functionality of a
+   previously defined extension, it MUST use a different name.
+   Extensions may register a set of related capabilities by registering
+   just a unique prefix for them.  The "comparator-" prefix is an
+   example of this.  The prefix MUST end with a "-" and MUST NOT overlap
+   any existing registrations.
+
+   In a situation where there is a script submission protocol and an
+   extension advertisement mechanism aware of the details of this
+   language, scripts submitted can be checked against the mail server to
+   prevent use of an extension that the server does not support.
+
+   Extensions MUST state how they interact with constraints defined in
+   section 2.10, e.g., whether they cancel the implicit keep, and which
+   actions they are compatible and incompatible with.  Extensions MUST
+   NOT change the behavior of the "require" control command or alter the
+   interpretation of the argument to the "require" control.
+
+   Extensions that can submit new email messages or otherwise generate
+   new protocol requests MUST consider loop suppression, at least to
+   document any security considerations.
+
+6.1.     Capability String
+
+   Capability strings are typically short strings describing what
+   capabilities are supported by the server.
+
+   Capability strings beginning with "vnd." represent vendor-defined
+   extensions.  Such extensions are not defined by Internet standards or
+   RFCs, but are still registered with IANA in order to prevent
+   conflicts.  Extensions starting with "vnd." SHOULD be followed by the
+   name of the vendor and product, such as "vnd.acme.rocket-sled".
+
+
+
+Guenther & Showalter         Standards Track                   [Page 29]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   The following capability strings are defined by this document:
+
+   encoded-character
+               The string "encoded-character" indicates that the
+               implementation supports the interpretation of
+               "${hex:...}" and "${unicode:...}" in strings.
+
+   envelope    The string "envelope" indicates that the implementation
+               supports the "envelope" command.
+
+   fileinto    The string "fileinto" indicates that the implementation
+               supports the "fileinto" command.
+
+   comparator- The string "comparator-elbonia" is provided if the
+               implementation supports the "elbonia" comparator.
+               Therefore, all implementations have at least the
+               "comparator-i;octet"
+               and "comparator-i;ascii-casemap" capabilities.  However,
+               these comparators may be used without being declared
+               with require.
+
+6.2.     IANA Considerations
+
+   In order to provide a standard set of extensions, a registry is
+   maintained by IANA.  Capability names may be registered on a first-
+   come, first-served basis.  Extensions designed for interoperable use
+   SHOULD be defined as standards track or IESG approved experimental
+   RFCs.  Registration of capability prefixes that do not begin with
+   "vnd."  REQUIRES a standards track or IESG approved experimental RFC.
+
+6.2.1.     Template for Capability Registrations
+
+   The following template is to be used for registering new Sieve
+   extensions with IANA.
+
+   To: iana@iana.org
+   Subject: Registration of new Sieve extension
+
+   Capability name: [the string for use in the 'require' statement]
+   Description:     [a brief description of what the extension adds
+                     or changes]
+   RFC number:      [for extensions published as RFCs]
+   Contact address: [email and/or physical address to contact for
+                     additional information]
+
+
+
+
+
+
+
+Guenther & Showalter         Standards Track                   [Page 30]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+6.2.2.     Handling of Existing Capability Registrations
+
+   In order to bring the existing capability registrations in line with
+   the new template, IANA is asked to modify each as follows:
+
+    1. The "capability name" and "capability arguments" fields
+       should be eliminated
+    2. The "capability keyword" field should be renamed to "Capability
+       name"
+    3. An empty "Description" field should be added
+    4. The "Standards Track/IESG-approved experimental RFC number" field
+       should be renamed to "RFC number"
+    5. The "Person and email address to contact for further information"
+       field should be renamed to "Contact address"
+
+6.2.3.     Initial Capability Registrations
+
+   This RFC updates the the following entries in the IANA registry for
+   Sieve extensions.
+
+   Capability name: encoded-character
+   Description:     changes the interpretation of strings to allow
+                    arbitrary octets and Unicode characters to be
+                    represented using US-ASCII
+   RFC number:      this RFC (Sieve base spec)
+   Contact address: The Sieve discussion list <ietf-mta-filters@imc.org>
+
+   Capability name: fileinto
+   Description:     adds the 'fileinto' action for delivering to a
+                    mailbox other than the default
+   RFC number:      this RFC (Sieve base spec)
+   Contact address: The Sieve discussion list <ietf-mta-filters@imc.org>
+
+   Capability name: envelope
+   Description:     adds the 'envelope' test for testing the message
+                    transport sender and recipient address
+   RFC number:      this RFC (Sieve base spec)
+   Contact address: The Sieve discussion list <ietf-mta-filters@imc.org>
+
+   Capability name: comparator-* (anything starting with "comparator-")
+   Description:     adds the indicated comparator for use with the
+                    :comparator argument
+   RFC number:      this RFC (Sieve base spec) and [COLLATION]
+   Contact address: The Sieve discussion list <ietf-mta-filters@imc.org>
+
+
+
+
+
+
+
+Guenther & Showalter         Standards Track                   [Page 31]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+6.3.     Capability Transport
+
+   A method of advertising which capabilities an implementation supports
+   is difficult due to the wide range of possible implementations.  Such
+   a mechanism, however, should have the property that the
+   implementation can advertise the complete set of extensions that it
+   supports.
+
+7.      Transmission
+
+   The [MIME] type for a Sieve script is "application/sieve".
+
+   The registration of this type for RFC 2048 requirements is updated as
+   follows:
+
+    Subject: Registration of MIME media type application/sieve
+
+    MIME media type name: application
+    MIME subtype name: sieve
+    Required parameters: none
+    Optional parameters: none
+    Encoding considerations: Most sieve scripts will be textual,
+       written in UTF-8.  When non-7bit characters are used,
+       quoted-printable is appropriate for transport systems
+       that require 7bit encoding.
+
+    Security considerations: Discussed in section 10 of this RFC.
+    Interoperability considerations: Discussed in section 2.10.5
+       of this RFC.
+    Published specification: this RFC.
+    Applications which use this media type: sieve-enabled mail
+      servers and clients
+    Additional information:
+      Magic number(s):
+      File extension(s): .siv .sieve
+      Macintosh File Type Code(s):
+    Person & email address to contact for further information:
+       See the discussion list at ietf-mta-filters@imc.org.
+    Intended usage:
+       COMMON
+    Author/Change controller:
+       See Editor information in this RFC.
+
+8.      Parsing
+
+   The Sieve grammar is separated into tokens and a separate grammar as
+   most programming languages are.
+
+
+
+
+Guenther & Showalter         Standards Track                   [Page 32]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+8.1.     Lexical Tokens
+
+   Sieve scripts are encoded in UTF-8.  The following assumes a valid
+   UTF-8 encoding; special characters in Sieve scripts are all US-ASCII.
+
+   The following are tokens in Sieve:
+
+           - identifiers
+           - tags
+           - numbers
+           - quoted strings
+           - multi-line strings
+           - other separators
+
+   Identifiers, tags, and numbers are case-insensitive, while quoted
+   strings and multi-line strings are case-sensitive.
+
+   Blanks, horizontal tabs, CRLFs, and comments ("white space") are
+   ignored except as they separate tokens.  Some white space is required
+   to separate otherwise adjacent tokens and in specific places in the
+   multi-line strings.  CR and LF can only appear in CRLF pairs.
+
+   The other separators are single individual characters, and are
+   mentioned explicitly in the grammar.
+
+   The lexical structure of sieve is defined in the following grammar
+   (as described in [ABNF]):
+
+   bracket-comment    = "/*" *not-star 1*STAR
+                        *(not-star-slash *not-star 1*STAR) "/"
+                          ; 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.)
+
+   comment            = bracket-comment / hash-comment
+
+   hash-comment       = "#" *octet-not-crlf CRLF
+
+   identifier         = (ALPHA / "_") *(ALPHA / DIGIT / "_")
+
+   multi-line         = "text:" *(SP / HTAB) (hash-comment / CRLF)
+                        *(multiline-literal / multiline-dotstart)
+                        "." CRLF
+
+   multiline-literal  = [ octet-not-period *octet-not-crlf ] CRLF
+
+   multiline-dotstart = "." 1*octet-not-crlf CRLF
+
+
+
+Guenther & Showalter         Standards Track                   [Page 33]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+                          ; A line containing only "." ends the
+                          ; multi-line.  Remove a leading '.' if
+                          ; followed by another '.'.
+
+   not-star           = CRLF / %x01-09 / %x0B-0C / %x0E-29 / %x2B-FF
+                          ; either a CRLF pair, OR a single octet
+                          ; other than NUL, CR, LF, or star
+
+   not-star-slash     = CRLF / %x01-09 / %x0B-0C / %x0E-29 / %x2B-2E /
+                        %x30-FF
+                          ; either a CRLF pair, OR a single octet
+                          ; other than NUL, CR, LF, star, or slash
+
+   number             = 1*DIGIT [ QUANTIFIER ]
+
+   octet-not-crlf     = %x01-09 / %x0B-0C / %x0E-FF
+                          ; a single octet other than NUL, CR, or LF
+
+   octet-not-period   = %x01-09 / %x0B-0C / %x0E-2D / %x2F-FF
+                          ; a single octet other than NUL,
+                          ; CR, LF, or period
+
+   octet-not-qspecial = %x01-09 / %x0B-0C / %x0E-21 / %x23-5B / %x5D-FF
+                          ; a single octet other than NUL,
+                          ; CR, LF, double-quote, or backslash
+
+   QUANTIFIER         = "K" / "M" / "G"
+
+   quoted-other       = "\" octet-not-qspecial
+                          ; represents just the octet-no-qspecial
+                          ; character.  SHOULD NOT be used
+
+   quoted-safe        = CRLF / octet-not-qspecial
+                          ; either a CRLF pair, OR a single octet other
+                          ; than NUL, CR, LF, double-quote, or backslash
+
+   quoted-special     = "\" (DQUOTE / "\")
+                          ; represents just a double-quote or backslash
+
+   quoted-string      = DQUOTE quoted-text DQUOTE
+
+   quoted-text        = *(quoted-safe / quoted-special / quoted-other)
+
+   STAR               = "*"
+
+   tag                = ":" identifier
+
+   white-space        = 1*(SP / CRLF / HTAB) / comment
+
+
+
+Guenther & Showalter         Standards Track                   [Page 34]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+8.2.     Grammar
+
+   The following is the grammar of Sieve after it has been lexically
+   interpreted.  No white space or comments appear below.  The start
+   symbol is "start".  Non-terminals for MATCH-TYPE, COMPARATOR, and
+   ADDRESS-PART are provided for use by extensions.
+
+   ADDRESS-PART = ":localpart" / ":domain" / ":all"
+
+   argument     = string-list / number / tag
+
+   arguments    = *argument [ test / test-list ]
+
+   block        = "{" commands "}"
+
+   command      = identifier arguments (";" / block)
+
+   commands     = *command
+
+   COMPARATOR   = ":comparator" string
+
+   MATCH-TYPE   = ":is" / ":contains" / ":matches"
+
+   start        = commands
+
+   string       = quoted-string / multi-line
+
+   string-list  = "[" string *("," string) "]" / string
+                    ; if there is only a single string, the brackets
+                    ; are optional
+
+   test         = identifier arguments
+
+   test-list    = "(" test *("," test) ")"
+
+9.      Extended Example
+
+   The following is an extended example of a Sieve script.  Note that it
+   does not make use of the implicit keep.
+
+    #
+    # Example Sieve Filter
+    # Declare any optional features or extension used by the script
+    #
+    require ["fileinto"];
+
+    #
+    # Handle messages from known mailing lists
+
+
+
+Guenther & Showalter         Standards Track                   [Page 35]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+    # Move messages from IETF filter discussion list to filter mailbox
+    #
+    if header :is "Sender" "owner-ietf-mta-filters@imc.org"
+            {
+            fileinto "filter";  # move to "filter" mailbox
+            }
+    #
+    # Keep all messages to or from people in my company
+    #
+    elsif address :DOMAIN :is ["From", "To"] "example.com"
+            {
+            keep;               # keep in "In" mailbox
+            }
+
+    #
+    # Try and catch unsolicited email.  If a message is not to me,
+    # or it contains a subject known to be spam, file it away.
+    #
+    elsif anyof (NOT address :all :contains
+                   ["To", "Cc", "Bcc"] "me@example.com",
+                 header :matches "subject"
+                   ["*make*money*fast*", "*university*dipl*mas*"])
+            {
+            fileinto "spam";   # move to "spam" mailbox
+            }
+    else
+            {
+            # Move all other (non-company) mail to "personal"
+            # mailbox.
+            fileinto "personal";
+            }
+
+10.     Security Considerations
+
+   Users must get their mail.  It is imperative that whatever method
+   implementations use to store the user-defined filtering scripts be
+   secure.
+
+   Several commands, such as "discard", "redirect", and "fileinto" allow
+   for actions to be taken that are potentially very dangerous.
+
+   Use of the "redirect" command to generate notifications may easily
+   overwhelm the target address, especially if it was not designed to
+   handle large messages.
+
+   Allowing a single script to redirect to multiple destinations can be
+   used as a means of amplifying the number of messages in an attack.
+   Moreover, if loop detection is not properly implemented it may be
+
+
+
+Guenther & Showalter         Standards Track                   [Page 36]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   possible to set up exponentially growing message loops. According,
+   Sieve implementations:
+
+   (1) MUST implement facilities to detect and break message loops. See
+       section 6.2 of [SMTP] for additional information on basic loop
+       detection strategies.
+
+   (2) MUST provide the means for administrators to limit the ability of
+       users to abuse redirect. In particular, it MUST be possible to
+       limit the number of redirects a script can perform. Additionally,
+       if no use cases exist for using redirect to multiple
+       destinations, this limit SHOULD be set to 1. Additional limits,
+       such as the ability to restrict redirect to local users MAY also
+       be implemented.
+
+   (3) MUST provide facilities to log use of redirect in order to
+       facilitate tracking down abuse.
+
+   (4) MAY use script analysis to determine whether or not a given
+       script can be executed safely. While the Sieve language is
+       sufficiently complex that full analysis of all possible scripts
+       is computationally infeasible, the majority of real-world
+       scripts are amenable to analysis.  For example, an
+       implementation might allow scripts that it has determined are
+       safe to run unhindered, block scripts that are potentially
+       problematic, and subject unclassifiable scripts to additional
+       auditing and logging.
+
+
+   Allowing redirects at all may not be appropriate in situations where
+   email accounts are freely-available and/or not trackable to a human
+   who can be held accountable for creating message bombs or other
+   abuse.
+
+   As with any filter on a message stream, if the sieve implementation
+   and the mail agents 'behind' sieve in the message stream differ in
+   their interpretation of the messages, it may be possible for an
+   attacker to subvert the filter.  Of particular note are differences
+   in the interpretation of malformed messages (e.g., missing or extra
+   syntax characters) or those that exhibit corner cases (e.g., NUL
+   octets encoded via [MIME3]).
+
+
+
+
+
+
+
+
+
+
+Guenther & Showalter         Standards Track                   [Page 37]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+11.     Acknowledgments
+
+   This document has been revised in part based on comments and
+   discussions that took place on and off the SIEVE mailing list.
+   Thanks to Sharon Chisholm, Cyrus Daboo, Ned Freed, Arnt Gulbrandsen,
+   Michael Haardt, Kjetil Torgrim Homme, Barry Leiba, Mark E. Mallett,
+   Alexey Melnikov, Eric Rescorla, Rob Siemborski, and Nigel Swinson for
+   reviews and suggestions.
+
+12.     Editors' Addresses
+
+   Philip Guenther
+   Sendmail, Inc.
+   6425 Christie St. Ste 400
+   Emeryville, CA 94608
+   Email: guenther@sendmail.com
+
+
+   Tim Showalter
+   Email: tjs@psaux.com
+
+
+13.  Normative References
+
+   [ABNF]      D. Crocker, Ed., P. Overell "Augmented BNF for Syntax
+               Specifications: ABNF", RFC 4234, October 2005.
+
+   [COLLATION] Newman, C., Duerst, M., and A. Gulbrandsen, "Internet
+               Application Protocol Collation Registry", RFC 4790, March
+               2007.
+
+   [IMAIL]     P. Resnick, Ed., "Internet Message Format", RFC 2822,
+               April 2001.
+
+   [KEYWORDS]  Bradner, S., "Key words for use in RFCs to Indicate
+               Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+   [MIME]      Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+               Extensions (MIME) Part One: Format of Internet Message
+               Bodies", RFC 2045, November 1996.
+
+   [MIME3]     Moore, K., "MIME (Multipurpose Internet Mail Extensions)
+               Part Three: Message Header Extensions for Non-ASCII
+               Text", RFC 2047, November 1996.
+
+   [SMTP]      J. Klensin, Ed., "Simple Mail Transfer Protocol", RFC
+               2821, April 2001.
+
+
+
+
+Guenther & Showalter         Standards Track                   [Page 38]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   [UTF-8]     Yergeau, F., "UTF-8, a transformation format of ISO
+               10646", RFC 3629, November 2003.
+
+14.  Informative References
+
+   [BINARY-SI] "Standard IEC 60027-2: Letter symbols to be used in
+               electrical technology - Part 2: Telecommunications and
+               electronics", January 1999.
+
+   [DSN]       Moore, K. and G. Vaudreuil, "An Extensible Message Format
+               for Delivery Status Notifications", RFC 3464, January
+               2003.
+
+   [FLAMES]    Borenstein, N, and C. Thyberg, "Power, Ease of Use, and
+               Cooperative Work in a Practical Multimedia Message
+               System", Int. J.  of Man-Machine Studies, April, 1991.
+               Reprinted in Computer-Supported Cooperative Work and
+               Groupware, Saul Greenberg, editor, Harcourt Brace
+               Jovanovich, 1991.  Reprinted in Readings in Groupware and
+               Computer-Supported Cooperative Work, Ronald Baecker,
+               editor, Morgan Kaufmann, 1993.
+
+   [IMAP]      Crispin, M., "Internet Message Access Protocol - version
+               4rev1", RFC 3501, March 2003.
+
+   [MDN]       T. Hansen, Ed., G. Vaudreuil, Ed., "Message Disposition
+               Notification", RFC 3798, May 2004.
+
+   [RFC3028]   Showalter, T., "Sieve: A Mail Filtering Language", RFC
+               3028, January 2001.
+
+15. Changes from RFC 3028
+
+   This following list is a summary of the changes that have been made
+   in the Sieve language base specification from [RFC3028].
+
+      1. Removed ban on tests having side-effects
+      2. Removed reject extension (will be specified in a separate RFC)
+      3. Clarified description of comparators to match [COLLATION], the
+         new base specification for them
+      4. Require stripping of leading and trailing whitespace in
+         "header" test
+      5. Clarified or tightened handling of many minor items, including:
+          - invalid [MIME3] encoding
+          - invalid addresses in headers
+          - invalid header field names in tests
+          - 'undefined' comparator result
+          - unknown envelope parts
+
+
+
+Guenther & Showalter         Standards Track                   [Page 39]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+          - null return-path in "envelope" test
+      6. Capability strings are case-sensitive
+      7. Clarified that fileinto should reencode non-ASCII mailbox
+         names to match the mailstore's conventions
+      8. Errors in the ABNF were corrected
+      9. The references were updated and split into normative and
+         informative
+     10. Added encoded-character capability and deprecated (but did not
+         remove) use of arbitrary binary octets in Sieve scripts.
+     11. Updated IANA registration template, and added IANA
+         considerations to permit capability prefix registrations.
+     12. Added .sieve as a valid extension for sieve scripts.
+
+16. Full Copyright Statement
+
+   Copyright (C) The IETF Trust (2007).
+
+   This document is subject to the rights, licenses and restrictions
+   contained in BCP 78, and except as set forth therein, the authors
+   retain all their rights.
+
+   This document and the information contained herein are provided on an
+   "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
+   OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND
+   THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
+   THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
+   WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Intellectual Property
+
+   The IETF takes no position regarding the validity or scope of any
+   Intellectual Property Rights or other rights that might be claimed to
+   pertain to the implementation or use of the technology described in
+   this document or the extent to which any license under such rights
+   might or might not be available; nor does it represent that it has
+   made any independent effort to identify any such rights.  Information
+   on the procedures with respect to rights in RFC documents can be
+   found in BCP 78 and BCP 79.
+
+   Copies of IPR disclosures made to the IETF Secretariat and any
+   assurances of licenses to be made available, or the result of an
+   attempt made to obtain a general license or permission for the use of
+   such proprietary rights by implementers or users of this
+   specification can be obtained from the IETF on-line IPR repository at
+   http://www.ietf.org/ipr.
+
+   The IETF invites any interested party to bring to its attention any
+
+
+
+Guenther & Showalter         Standards Track                   [Page 40]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+   copyrights, patents or patent applications, or other proprietary
+   rights that may cover technology that may be required to implement
+   this standard.  Please address the information to the IETF at ietf-
+   ipr@ietf.org.
+
+Acknowledgement
+
+   Funding for the RFC Editor function is currently provided by the IETF
+   Administrative Support Activity (IASA).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Guenther & Showalter         Standards Track                   [Page 41]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+Appendix A. Change History
+
+   This section will be removed when this document leaves the Internet-
+   Draft stage.
+
+   Changes from draft-ietf-sieve-3028bis-12.txt
+    1. Merged in changes from original RFC Editor note
+    2. Added additional security considerations for redirect
+
+   Changes from draft-ietf-sieve-3028bis-11.txt
+    1. Correct typo in boilerplate
+    2. Update [DSN] reference to RFC 3464
+
+   Changes from draft-ietf-sieve-3028bis-10.txt
+    1. Clarify how the "redirect" action uses the address argument
+    2. Eliminate the phrase "original message"
+    3. If an outbound address doesn't match the syntax, it's an error
+
+   Changes from draft-ietf-sieve-3028bis-09.txt
+    1. [MDN] reference is merely informative
+    2. Whitespace tweaks in the ABNF
+    3. Extensions can't change "require"
+    4. fileinto a nonexistent mailbox is implementation defined behavior
+    5. Clarify the definition of the size of a message
+    6. Make the KEYWORDS boilerplate match expectations
+    7. Add the encoded-character extension
+    8. Remove duplication in text regarding unknown extensions
+    9. Address security concerns about looping with redirect or other
+       extensions
+    10. Valid numbers include zero
+    11. Various changes suggested by the gen-art reviewer
+    12. Removed references to the Halting Problem.  Humor is dead
+    13. Clarify which tokens are case-insensitive and which are
+        case-sensitive; use the 'unexpected' case in several examples
+    14. Add .sieve as an extension for the application/sieve MIME type
+    15. Permit registration of capability prefixes (like "comparator-"),
+        but require an IESG approved RFC when they're outside the
+        "vnd." 'namespace'
+    16. Replace "example.edu" with "example.com"
+    17. Update boilerplate
+    18. Updated pages numbers in table of contents
+
+   Changes from draft-ietf-sieve-3028bis-08.txt
+    1. [RFC3028] reference is merely informative
+    2. String lists are literal data
+    3. Tagged and optional arguments can take any sort of literal data
+       as arguments
+    4. Change "folder" to "mailbox" throughout
+
+
+
+Guenther & Showalter         Standards Track                   [Page 42]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+    5. Added more items to the "Changes from RFC 3028" list
+    6. A multi-line string includes the CRLF before the final dot
+
+   Changes from draft-ietf-sieve-3028bis-07.txt
+    1. Improve description in the extension registrations
+    2. Give IANA directions on how to massage existing registrations
+       into the new form
+    3. Added "Changes from RFC 3028" section
+    4. Updated pages numbers in table of contents
+    5. Permit non-UTF-8 octet sequences in comments
+    6. It's an error to use conflicting or repeated tagged and optional
+       arguments
+    7. Update description of script encoding
+
+   Changes from draft-ietf-sieve-3028bis-06.txt
+    1. Tweak wording of how :matches uses character definition
+       of comparator
+    2. Add security consideration regarding "redirect" as a notification
+       method
+    3. fileinto SHOULD reencode; mention IMAP's mUTF-7
+    4. en;ascii-casemap is gone; switch back to i;ascii-casemap
+    5. Permit non-UTF-8 octet sequences in strings
+    6. Sort grammar non-terminals
+    7. Syntactically invalid addresses don't match :localpart or :domain
+    8. The null return-path has empty address parts
+    9. Treat comparator result of "undefined" the same as "no-match"
+    10. Envelope sender on redirects is implementation defined
+    11. Change IANA registration template
+
+   Changes from draft-ietf-sieve-3028bis-05.txt
+    1. The specifics of what names are acceptable for fileinto and
+       the handling of invalid names are both implementation-defined
+    2. Update to draft-newman-i18n-comparator-07.txt
+    3. Adjust the example in 5.7 again
+
+   Changes from draft-ietf-sieve-3028bis-04.txt
+    1. Change "Syntax:" to "Usage:"
+    2. Update ABNF reference to RFC 4234
+    3. Add non-terminals for MATCH-TYPE, COMPARATOR, and ADDRESS-PART
+    4. Strip leading and trailing whitespace in the value being matched
+       by header
+    5. Collations operate on octets, not characters, and for character
+       data that is the UTF-8 encoding of the Unicode characters
+    6. :matches uses character definition of comparator
+
+   Changes from draft-ietf-sieve-3028bis-03.txt
+    1. Remove section 2.4.2.4., MIME Parts, as unreferenced
+    2. Update to draft-newman-i18n-comparator-04.txt
+
+
+
+Guenther & Showalter         Standards Track                   [Page 43]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+    3. Various tweaks to examples and syntax lines
+    4. Define "control structure" as a control command with a block
+       argument, then use it consistently.  Reword description of
+       blocks to match
+    5. Clarify that "header" can never match an absent header and give
+       the preferred way to test for absent or empty
+    6. Invalid header name syntax is not an error _in tests_ (but could
+       be elsewhere)
+    7. Implementation SHOULD consider unknown envelope parts an error
+    8. Remove explicit "omitted" option from 2.7.2p2
+
+   Changes from draft-ietf-sieve-3028bis-02.txt
+    1. Change "ASCII" to "US-ASCII" throughout
+    2. Tweak section 2.7.2 to not require use of UTF-8 internally and
+       to explicitly leave implementation-defined the handling of text
+       that can't be converted to Unicode
+    3. Add reference to RFC 2047
+    4. Clarify that capability strings are case-sensitive
+    5. Clarify that address, envelope, and header return false if no
+       combination of arguments match
+    6. Directly state that code that isn't reached may still be checked
+       for errors
+    7. Invalid header name syntax is not an error
+    8. Remove description of header unfolding that conflicts with
+       [IMAIL]
+    9. Warn that filters may be subvertable if agents interpret messages
+       differently
+    10. Encoded NUL octets SHOULD NOT cause truncation
+
+   Changes from draft-ietf-sieve-3028bis-01.txt
+    1. Remove ban on side effects
+    2. Remove definition of the 'reject' action, as it is being moved
+       to the doc that also defines the 'refuse' action
+    3. Update capability registrations to reference the mailing list
+    4. Add Tim back as an editor
+    5. Refer to the zero-length string ("") as "empty" instead of
+       "null"
+
+   Changes from draft-ietf-sieve-3028bis-00.txt
+    1. More grammar corrections:
+       - permit /***/,
+       - remove ambiguity in finding end of bracket comment,
+       - require valid UTF-8,
+       - express quoting in the grammar
+       - ban bare CR and LF in all locations
+    2. Correct a bunch of whitespace and linewrapping nits
+    3. Update IMAIL and SMTP references to RFC 2822 and RFC 2821
+    4. Require support for en;ascii-casemap comparator as well as the
+
+
+
+Guenther & Showalter         Standards Track                   [Page 44]
+
+Internet-Draft     Sieve: An Email Filtering Language      February 2007
+
+
+       old i;ascii-casemap.  As with the old one, you do not need to
+       use 'require' to use the new comparator
+    5. Update IANA considerations to update the existing registrations
+       to point at this doc instead of 3028
+    6. Scripts SHOULD NOT contain superfluous backslashes
+    7. Update Acknowledgments
+
+   Changes from RFC 3028
+    1. Split references into normative and informative
+    2. Update references to current versions of DSN, IMAP, MDN, and
+       UTF-8 RFCs
+    3. Replace "e-mail" with "email"
+    4. Incorporate RFC 3028 errata
+    5. The "reject" action cancels the implicit keep
+    6. Replace references to ACAP with references to the i18n-comparator
+       draft.  Further work is needed to completely sync with that
+       draft
+    7. Start to update grammar to only permit legal UTF-8 (incomplete)
+       and correct various other errors and typos
+    8. Update IPR broilerplate to RFC 3978/3979
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Guenther & Showalter         Standards Track                   [Page 45]
+
diff --git a/sieve/tests/encoded-character.sieve b/sieve/tests/encoded-character.sieve
new file mode 100644
index 000000000..6b629b3a2
--- /dev/null
+++ b/sieve/tests/encoded-character.sieve
@@ -0,0 +1 @@
+require "encoded-character";
diff --git a/src/lib-sieve/ext-encoded-character.c b/src/lib-sieve/ext-encoded-character.c
new file mode 100644
index 000000000..69f944b02
--- /dev/null
+++ b/src/lib-sieve/ext-encoded-character.c
@@ -0,0 +1,46 @@
+/* Extension encoded-character 
+ * ---------------------------
+ *
+ * Authors: Stephan Bosch
+ * Specification: draft-ietf-sieve-3028bis-13.txt
+ * Implementation: skeleton  
+ * Status: under development
+ *
+ */
+
+#include "lib.h"
+
+#include "sieve-extensions.h"
+#include "sieve-validator.h"
+
+/* Forward declarations */
+
+static bool ext_encoded_character_load(int ext_id);
+static bool ext_encoded_character_validator_load(struct sieve_validator *validator);
+
+/* Extension definitions */
+
+static int ext_my_id;
+	
+struct sieve_extension encoded_character_extension = { 
+	"encoded-character", 
+	ext_encoded_character_load,
+	ext_encoded_character_validator_load, 
+	NULL, NULL, NULL, 
+	SIEVE_EXT_DEFINE_NO_OPCODES, 
+	NULL 
+};
+
+static bool ext_encoded_character_load(int ext_id) 
+{
+	ext_my_id = ext_id;
+	return TRUE;
+}
+
+/* Load extension into validator */
+
+static bool ext_encoded_character_validator_load
+	(struct sieve_validator *validator ATTR_UNUSED)
+{
+	return TRUE;
+}
-- 
GitLab