Sieve (mail filtering language)
From Wikipedia, the free encyclopedia
Sieve is a language that can be used to create filters for electronic mail. 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 822-compliant messages, but otherwise should generalize to other systems that meet these criteria. It was specified in RFC 3028, although the IETF is currently revising the language and its common extensions.
Sieve differs from traditional 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.
[edit] Example
This is an example sieve script:
# example script # de.wikipedia.org # require ["fileinto", "reject"]; # Messages bigger than 100K will be rejected with an error message # if size :over 100K { reject "Please send me the next time a smaller Mail. Put huge attachments on a server and send me a link. Thanks."; } # Mails from a mailinglist will be put into the folder "mailinglist" # elsif address :is ["From", "To"] "mailinglist@blafasel.invalid" { fileinto "INBOX.mailinglist"; } # Spam Rule: Message does not contain my address in To, CC or Bcc # header, or subject is something with "money" or "Viagra". # elsif anyof (not address :all :contains ["To", "Cc", "Bcc"] "me@blafasel.invalid", header :matches "Subject" ["*money*","*Viagra*"]) { fileinto "INBOX.spam"; } # Keep the rest. # This is not nessesary because there is a "implicit keep" Rule else { keep; }