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:
- Copying Without Side Effects (RFC 3894)
- Body (RFC 5173)
- Vacation (RFC 5230)
- Seconds parameter for Vacation (RFC 6131)
- Relational (RFC 5231)
- Imap4flags (RFC 5232)
- Regular expression (Draft)
The following extensions are partially 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
, LOGIN
and OAUTHBEARER
.
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.