Sieve is a programming language that can be used for email filtering. It owes its creation to the CMU Cyrus Project, creators of Cyrus IMAP server. The language is not tied to any particular operating system or mail architecture. It requires the use of RFC 2822-compliant messages, but otherwise should generalize to other systems that meet these criteria. The current version of Sieve's base specification is outlined in RFC 5228, published in January 2008.
Language
Sieve is a data-driven programming language, similar to earlier email filtering languages such as procmail and maildrop, and earlier line-oriented languages such as sed and AWK: it specifies conditions to match and actions to take on matching. This differs from general-purpose programming languages in that it is highly limited – the base standard has no variables, and no loops, preventing runaway programs and limiting the language to simple filtering operations. Although extensions have been devised to extend the language to include variables and, to a limited degree, loops, the language is still highly restricted, and thus suitable for running user-devised programs as part of the mail system. There are also a significant number of restrictions on the grammar of the language, in order to reduce the complexity of parsing the language, but the language also supports the use of multiple methods for comparing localized strings, and is fully Unicode-aware.
Use
The Sieve scripts may be generated by a GUI-based rules editor or they may be entered directly using a text editor. The scripts are transferred to the mail server in a server-dependent way. The ManageSieve protocol allows users to manage their Sieve scripts on a remote server. Mail servers with local users may allow the scripts to be stored in e.g. a.sieve file in the users' home directories.
History
The language was standardized in the RFC 3028 of January 2001, by Tim Showalter.
Extensions
The IETF Sieve working group has updated the base specification in 2008, and has brought the following extensions to Proposed Standard status:
RFC 5173 – Body; allows a script to test the body of a message, not just its header.
RFC 5229 – Variables; allows the script to save and retrieve values in variables.
RFC 5230 – Vacation; specifies an action to send a response informing the sender that the recipient may be away.
RFC 5231 – Relational tests; defines numeric tests, so that a script may test a field for a numeric value, and may test against the number of occurrences of a field.