The ‘variables’ extension is defined in RFC 5229. It is a built-in extension. It introduces support for variables in Sieve scripts.
There are two kind of variables: user-defined and match variables.
A user-defined variable is initialized using the set
action:
[modifiers] name(string) value(string) ¶Stores the specified value in the variable identified by name. Optional modifiers are applied on value before it is stored in the variable.
The following modifiers are available:
:lowerConvert value to lower case letters.
:upperConvert value to upper case letters.
:lowerfirstConvert the first character in value to lower case.
:upperfirstConvert the first character in value to upper case.
:quotewildcardQuote wildcard characters (‘*’, ‘?’, ‘\’) by prefixing
each occurrence with a backslash (‘\’). This can be used to
ensure that the variable will only match a literal occurrence if used
as a parameter to :matches.
:lengthThe value is the decimal number of characters in the expansion, converted to a string.
When several modifiers are present, they are applied in the following order of precedence (largest value first):
| precedence | modifiers |
|---|---|
| 40 | :lower or :upper |
| 30 | :lowerfirst or :upperfirst |
| 20 | :quotewildcard |
| 10 | :length |
Modifiers having the same precedence (i.e. listed on the same row in the above table) cannot be used together.
Variables are referenced within text strings using the construct
‘${name}’, where name is the name of the variable
as it appeared in the first parameter to the set statement.
For example:
require "variables";
set "sender" "root
":
if envelope :matches "${sender}"
{
...
}
Match variables refer to parts of the most recently evaluated
successful match of type :matches or :regex. They have
names consisting entirely of decimal digits. The variable
‘${0}’ refers to the entire matched expression. The variable
‘${1}’ refers to the substring matching the first occurrence of
the wildcard (‘?’ and ‘*’), ‘${2}’ refers to the
second occurrence and so on. The wildcards match as little as possible
(non-greedy matching). For example:
require ["variables", "fileinto"];
if header :matches "List-ID" "*<*
" {
fileinto "INBOX.lists.${2}";
stop;
}
If :regex match is used, the match variables starting from
‘${1}’ refer to the substrings of the argument value matching
subsequent parenthesized groups of the regular expression.
[comparator] [match-type] source(string-list) keys(string-list) ¶The string test compares two strings according to the selected
comparator and match type. The test evaluates to ‘true’ if any
two strings from source and keys match.
The ‘:count’ match used in ‘string’ counts each empty string as 0, and each non-empty one as 1. The count of a string list is the sum of the counts of the member strings.