Client-side Sieve and Managesieve library written in Python.
- Sieve : An Email Filtering Language (RFC 5228)
- ManageSieve : A Protocol for Remotely Managing Sieve Scripts (RFC 5804)
Currently, the provided parser supports most of the functionalities described in the RFC. The only exception concerns section 2.4.2.4. Encoding Characters Using "encoded-character" which is not supported.
The following extensions are also supported:
It is possible to extend the parser by adding new supported commands. For example:
import sievelib
def MyCommand(sievelib.commands.ActionCommand):
args_definition = [
{"name": "testtag",
"type": ["tag"],
"write_tag": True,
"values": [":testtag"],
"extra_arg": {"type": "number",
"required": False},
"required": False},
{"name": "recipients",
"type": ["string", "stringlist"],
"required": True}
]
sievelib.commands.add_commands(MyCommand)
The parser can either be used from the command-line:
$ cd sievelib $ python parser.py test.sieve Syntax OK $
Or can be used from a python environment (or script/module):
>>> from sievelib.parser import Parser
>>> p = Parser()
>>> p.parse('require ["fileinto"];')
True
>>> p.dump()
require (type: control)
["fileinto"]
>>>
>>> p.parse('require ["fileinto"]')
False
>>> p.error
'line 1: parsing error: end of script reached while semicolon expected'
>>>
Some high-level classes are provided with the factory module, they
make the generation of Sieve rules easier:
>>> from sievelib.factory import FiltersSet
>>> fs = FiltersSet("test")
>>> fs.addfilter("rule1",
... [("Sender", ":is", "[email protected]"),],
... [("fileinto", "Toto"),])
>>> fs.tosieve()
require ["fileinto"];
# Filter: rule1
if anyof (header :is "Sender" "[email protected]") {
fileinto "Toto";
}
>>>
Additional documentation is available within source code.
All mandatory commands are supported. The RENAME extension is
supported, with a simulated behaviour for server that do not support
it.
For the AUTHENTICATE command, supported mechanisms are DIGEST-MD5,
PLAIN and LOGIN.
The ManageSieve client is intended to be used from another python application (there isn't any shell provided):
>>> from sievelib.managesieve import Client
>>> c = Client("server.example.com")
>>> c.connect("user", "password", starttls=False, authmech="DIGEST-MD5")
True
>>> c.listscripts()
("active_script", ["script1", "script2"])
>>> c.setactive("script1")
True
>>> c.havespace("script3", 45)
True
>>>
Additionnal documentation is available with source code.