At the lowest level, the {\ttfamily milter} module provides a thin wrapper around the {\texttt{ sendmail libmilter API}}. This API lets you register callbacks for a number of events in the process of sendmail receiving a message via SMTP. These events include the initial connection from a MTA, the envelope sender and recipients, the top level mail headers, and the message body. There are options to mangle all of these components of the message as it passes through the milter.

At the next level, the {\ttfamily \doxyref{Milter}{p.}{namespaceMilter}} module (note the case difference) provides a Python friendly object oriented wrapper for the low level API. To use the \doxyref{Milter}{p.}{namespaceMilter} module, an application registers a \textquotesingle{}factory\textquotesingle{} to create an object for each connection from a MTA to sendmail. These connection objects must provide methods corresponding to the libmilter event callbacks.

Each callback method returns a code to tell sendmail whether to proceed with processing the message. This is a big advantage of milters over other mail filtering systems. Unwanted mail can be stopped in its tracks at the earliest possible point. The callback return codes are \doxyref{milter.\+CONTINUE}{p.}{namespacemilter_a590b7ab395513af007869ad83e332c14}, \doxyref{milter.\+REJECT}{p.}{namespacemilter_a2345250030581a1639ecf905e1668b0a}, \doxyref{milter.\+DISCARD}{p.}{namespacemilter_a4c8bad190cb7f54cea87f1182732ce83}, \doxyref{milter.\+ACCEPT}{p.}{namespacemilter_ae40b8bfbb6828233115c61490998f7f4}, \doxyref{milter.\+TEMPFAIL}{p.}{namespacemilter_a1b4940e90c267a81cba6be20aa782e85}, \doxyref{milter.\+SKIP}{p.}{namespacemilter_aa2fa23a83f9bbc204eb14313a6efd4cc}, \doxyref{milter.\+NOREPLY}{p.}{namespacemilter_a45378e0b42f76927adaf504b6082fc7d}.

The \doxyref{Milter.\+Base}{p.}{classMilter_1_1Base} class provides default implementations for event methods that do nothing, and also provides wrappers for the libmilter methods to mutate the message. It automatically negotiates with MTA which protocol steps need to be processed by the milter, based on which callback methods are overridden.

The \doxyref{Milter.\+Milter}{p.}{classMilter_1_1Milter} class provides an alternate default implementation that logs the main milter callbacks, but otherwise does nothing. It is provided for compatibility.

The mime module provides a wrapper for the Python email package that fixes some bugs, and simplifies modifying selected parts of a MIME message.\doxysection{threading}\label{index_threading}
The libmilter library which pymilter wraps {\texttt{ handles all signals}} itself, and expects to be called from a single main thread. It handles SIGTERM, SIGHUP, and SIGINT, mapping the first two to {\texttt{ smfi\+\_\+stop}} and the last to an internal ABORT.

If you use python threads or threading modules, then signal handling gets confused. Threads may still be useful, but you may need to provide an alternate means of causing graceful shutdown.

You may find the {\texttt{ multiprocessing}} module useful. It can be a drop-\/in replacement for threading as illustrated in {\texttt{ milter-\/template.\+py}}.\doxysection{python packages for milters}\label{index_Useful}
{\texttt{ pymilter}} -\/ this package.

{\texttt{ pyspf}} checks the SMTP envelope sender (MAIL FROM, passed to the \doxyref{Milter.\+Base.\+envfrom}{p.}{classMilter_1_1Base_a3d6e5676f4bc54069c996f404d474f41} callback) against a Sender Policy published in DNS by the sending domain. This can prevent forgery of the MAIL FROM. SPF is Sender Policy Framework.

{\texttt{ pydkim}} checks a DKIM signature of the email body and headers against a public key published in DNS by the signing domain. DKIM is Domain\+Keys Identified Mail.

The {\texttt{ authres}} module parses and formats the Authentication-\/\+Results email header, providing a standard place to summarize the results from DKIM, SPF, r\+DNS, SMTP AUTH, and other email authentication methods.

{\texttt{ pydspam}} wraps the libdspam API of the {\texttt{ DSPAM}} project.

{\texttt{ pysrs}} rewrites MAIL FROM to include a timestamped signature so that \char`\"{}bounce spam\char`\"{} can be immediately rejected.

{\texttt{ pygossip}} is a system to track reputation by domain and authentication level and type, and a simple protocol to gossip about reputations with other mail servers.\doxysection{written with pymilter}\label{index_Milters}
{\texttt{ Verify Domain}} is a Postfix milter that rejects/fixes manipulated From\+: header on a mail host with multiple virtual domains.

{\texttt{ BMS Milter}} has several milters, a big complicated spam filter that integrates multiple authentication protocols with pydspam, and two simple ones\+: spfmilter.\+py and dkim-\/milter.\+py. 