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)
To install sievelib
from PyPI:
pip install sievelib
To install sievelib from git:
git clone git@github.com:tonioo/sievelib.git
cd sievelib
python ./setup.py install
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
class 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", "toto@toto.com"),],
... [("fileinto", "Toto"),])
>>> fs.tosieve()
require ["fileinto"];
# Filter: rule1
if anyof (header :is "Sender" "toto@toto.com") {
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
>>>
Additional documentation is available with source code.