Parsers and state machines for the Sendmail milter communications protocol
Project description
Kilter Protocol
Kilter is a framework for writing mail filters (known as "milters")
compatible with Sendmail and Postfix MTAs. Unlike many previous milter implementations in
Python it is not simply bindings to the libmilter library (originally from the Sendmail
project). The framework aims to provide Pythonic interfaces for implementing filters,
including leveraging coroutines instead of libmilter's callback-style interface.
The kilter.protocol package contains the parsers and filter state machine for the
communications protocol used between the Mail Transfer Agents (MTA) and filters.
Users looking for something as simple to use as libmilter should take a look
at kilter.service.
What is understood about the wire protocol is documented in Wire Protocol.
Sendmail Filters
The Sendmail filter (milter) API facilitates communication between a Mail Transfer Agent (MTA) and arbitrary filters running as external services. These filters can perform a number of operations on received and outgoing mail, such as: virus scanning; checking senders' reputations; signing outgoing mail; and verifying signatures of incoming mail.
While the protocol was originally for filtering mail through a Sendmail MTA, Postfix has also reverse engineered the protocol and supports most filters made for Sendmail.
libmilter
Historically filters used the libmilter library supplied by the Sendmail project to handle
all aspects of communication with an MTA. Filters simply registered callbacks for various
events then started the library's main loop. This approach makes implementing simple filters
in C easy for users, but makes writing "Pythonic" filters difficult, especially when a user
wishes to make use of async/await features.
Use of libmilter to implement filters is almost universal as it is a black-box; the
on-the-wire protocol used is undocumented and subject to change between versions, which
makes writing a third-party parser difficult.
Usage
Most users will be looking for an asynchronous API using Python coroutines: this is
available with the kilter.service package. The protocol handlers provided by this
package support asynchronous operation but does not handle any IO, thus have no awaitable
entrypoints. Instead a service that handles socket communication with MTAs passes bytes from
a socket to a protocol handler, which returns event objects. Some of these events instruct
the service to pass bytes back to the socket, others are actionable in ways that are
implementation specific. When an implementation wants to communicate with an MTA, it
registers messages with the protocol handler, which again returns event objects.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kilter_protocol-0.6.0.tar.gz.
File metadata
- Download URL: kilter_protocol-0.6.0.tar.gz
- Upload date:
- Size: 20.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.10.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8294bb17e4d0d6c73ef39021add9670c7c2d6bebf53338a2f4311f4c282ef2e8
|
|
| MD5 |
ddfecc4a64481adef5b6374628a7f470
|
|
| BLAKE2b-256 |
69d7862829d34424b5544ba8386ea6eca5a1e83c2f968da9311b6eb92ca132af
|
File details
Details for the file kilter_protocol-0.6.0-py3-none-any.whl.
File metadata
- Download URL: kilter_protocol-0.6.0-py3-none-any.whl
- Upload date:
- Size: 16.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.10.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
74fa68670642f95a5122b60192a3f127fd29f5896c725973d737f24505fe861d
|
|
| MD5 |
0c00d988b63050f6f118fb248f1d76c0
|
|
| BLAKE2b-256 |
ef0e0aafaaab387e2cf6e10d0b6e6c3aee8396cec84b27e525a248ffc3f3e454
|