Electronic Mail Processing

This category gathers projects related to various aspects of electronic mail handling.

To facilitate navigating in this list, projects are categorized by their purpose, authorship, and current state. Each project entry lists the categories it pertains to. Clicking on a category name will bring a listing of all projects in that category.

Additionally, a list of related projects is provided where applicable. Each element in that list is a link to the corresponding project entry.

Clicking on a project's name will bring this project's entry as a separate page (a permalink).

Hovering your mouse over the version information of a project shows the list of changes introduced by that version.

Sort controls below allow you to order the list either lexicographically or by the most recent release date, in both directions.

Using the Search control, you can select projects by name. Shell-style globbing patterns (wildcards) are accepted.

(Return to the project listing)


Version: 4.2  —  2014-05-23
** New operation mode: proxy

** Command line option precedence

Command line options take precedence over configuration file

** elif statement

A familiar `elif' statement is supported, e.g.:

if condition-1
elif condition-2
elif condition-3
** New CONTROL statement esmtp-auth-delayed.

When set to `yes', this statement instructs Anubis to postpone ESMTP
authentication until MAIL command is issued by the client.  This
allows to change authentication credentials in the SMTP section (see

** SMTP section

The new section "SMTP" is invoked each time an SMTP command
is received. This section may alter the command's argument, using the
"modify command", e.g.:

regex :extended
modify command [ehlo] "foo.bar.net"
if command ["mail from:"] "<(.*)>(.*)"
  modify command ["mail from:"] "<root@bar.net>\2"

It is also allowed to use esmtp-* keywords in this section, provided
that `esmtp-auth-delayed yes' is set in the CONTROL section. Changes
in the ESMTP authentication credentials take effect if they occur
either before receiving MAIL command from the client, or when handling
this command, e.g.:

if command ["mail from:"] "<smith(\+.*)?@@example.net>"
  esmtp-auth-id smith
  esmtp-password guessme
  esmtp-auth no

** New keywords: log-facility and log-tag

** Guile output

By default Scheme's standard error and output ports are redirected to
syslog, using priorities `err' and `warning' correspondingly.

** MySQL options file

When using MySQL for Anubis user database, the database parameters and
access credentials are read from the file /etc/my.cnf, section
"anubis".  Additionally, two URL parameters are provided:
"options-file", which sets the name of the options file, and
"options-group", which sets the name of the group.


An SMTP message submission daemon. It represents an intermediate layer between mail user agent (MUA) and mail transport agent (MTA), receiving messages from the MUA, applying to them a set of predefined changes and finally inserting modified messages into an MTA routing network. The set of changes applied to a message is configurable on a system-wide and per-user basis.

Related projects:


Version: 8.17  —  2023-07-07
* Multiple handler definitions

Multiple "prog" declarations with the same handler name are now
allowed.  Such declarations are processed the same way multiple
"begin" and "end" sections were processed in prior versions:
when compiling the filter program, the code from all "prog"
declarations having the same handler name is combined into one code
block, in the same order the declarations appear in the source

This allows MFL modules to define handler snippets.

* New special handler: action

The "action" special handler is executed before communicating the reply
action (accept, reject, etc.) to the server.  The handler takes four
arguments: numeric identifier of the action that is about to be
returned, SMTP response code, extended response code, and textual
message passed along with the action.  The last three arguments are
meaningful only for reject and tempfail actions.

Action handlers can be used for logging or accounting of the executed

* New variable: milter_state

The milter_state variable is initialized with the numeric code of
the current milter state.  Using this variable a function can execute
code depending on the handler it was called from.

The new module "milter.mfl" defines numeric constants for milter
states.  The functions milter_state_name and milter_state_code can
be used to convert this code to symbolic name and vice versa.

* New functions

The following new functions are provided to convert numeric
identifiers of various MFL entities to strings and vice-versa:

** string milter_state_name (number code)

Returns symbolic name of the milter state identified by its code.

** number milter_state_code (string name)

Returns numeric code of the state identified by its name.

** string milter_action_name (number code)

Returns symbolic name of the reply action identified by its code.

** number milter_action_name (string name)

Returns numeric code of the action identified by its name.

** void dbbreak (number @var{dbn})

Stop sequential access to the database and deallocate all associated
resources.  Use this function if you need to break from the sequential
access loop, e.g.:

  loop for number dbn dbfirst(dbname)
    if some_condition
  done while dbnext(dbn)

* New module: cdb

The "cdb" (control database) module provides functions for deciding
what MFL action to take depending on the result of a look up in a DBM
file.  Keys in the database have the format "PREFIX:KEY", where PREFIX
is one of:

  email		match sender email
  ip            match sender IP address
  domain        match sender domain part
  subdomain     search for a match among the domain part and its parent
  mx            match MX of the sender domain part

Values are (case-insensitive):

  OK            continue executing the MFL code
  ACCEPT        accept the mail
  REJECT	reject the mail (550)
  TEMPFAIL      return a temporary failure (451)
  GREYLIST      greylist the mail

or action specification in the form

  [code [xcode]] text

where code is 3-digit SMTP response code, xcode is extended SMTP code,
and text is explanatory reason text.  Both code and xcode must begin
with '4' or '5'.  If code and xcode are missing, reject the mail with
550 5.1.0 and the given text.

This module exports one function:

  func cdb_check(string prefix, string key)

Depending on the value of the prefix argument it does the following:

      Look up the "ip:KEY" in the database.  If found, take the action
      as described above.
      Key is an email address.  Obtain its canonical form by
      splitting it into local and domain parts, converting the latter
      to lower case, reassembling the parts back into an email address
      and prefixing it with the string "email:".  Look up the resulting
      string in the database.  Take action indicated by the value.
      Key is an email address.  Extract its domain part, convert it
      to lower case and prefix it with "domain:".  Look up resulting
      string in the database.  If the look up succeeds, take action
      indicated by the value found.
      Same as above, but in case of failure, strip the shortest
      hostname prefix (everything up to the first dot, inclusively)
      from the domain and restart with the resulting value.  Continue
      process until a match is found or the argument is reduced to empty
      Key is an email address.  Extract its domain part.  For each of
      its MX servers, look up the key "mx:SERVER" and, if found, take
      action indicated by the value found.

The cdb_check function returns to caller only if the key was not
found in the database, or the lookup returned "OK" (case-insensitive)
or an empty string.  Otherwise, if the lookup returns an action, this
action will be performed and further execution of the filter code will

If the looked up value was "GREYLIST" while the function was called
from the handler prior to "envrcpt" (i.e. "connect", "helo", or
"envfrom"), the current handler will return and normal control flow
will resume from the next handler (as if by "continue" action). Actual
greylisting will be performed later, on entry to "envrcpt" handler.

The following global variables control the functionality of the

  cdb_name    Name of the control database file.  Defaults to
              Greylisting time.  Defaults to 900 seconds.

* mtasim: check expected textual replies

The "\E" command accepts optional second argument.  If supplied,
it is treated as an extended regular expression.  The subsequent
command will then succeed if its return code matched the one supplied
as the first argument, and its extended SMTP code and textual message
match the supplied regular expression.

* Bugfixes

** mtasim: correctly pass final body chunk to the milter

** Fix discrepancy between $N and $(N)

Both terms now mean exactly the same: Nth variadic argument.

** fix type conversions of typed variadic arguments

** Milter library: eliminate trailing space from arguments passed to handlers

** Milter server: don't pass extra \0 when sending multiple strings

** Fix handling of reply actions without explicit message text

In previous versions, the reject and tempfail actions would use the
default reply code if called without explicit message text (3rd

Mailfromd is a general-purpose mail filtering daemon for Sendmail, Postfix and MeTA1. It is able to filter both incoming and outgoing messages using criteria of arbitrary complexity, supplied by the administrator in the form of a script file. The daemon interfaces with the MTA using Milter or PMilter protocols.


Version: 3.16  —  2023-05-01
* Support for Berkeley DB version 2 withdrawn

* Bugfixes
** rdcache streams: fix stream size computation
** tlsfdstr streams: fix error handling
** wordwrap streams: fix handling of overflowing lines

GNU Mailutils is a swiss army knife of electronic mail handling. It contains a rich set of mail-related utilities and daemons, including pop3d, imap4d, sieve and several domain-specific mail delivery agents.

Related projects:


Version: 1.0  —  2019-08-01
Initial release.

Copyright information:

Copyright (C) 2016-2019 Sergey Poznyakoff

   Permission is granted to anyone to make or distribute verbatim copies
   of this document as received, in any medium, provided that the
   copyright notice and this permission notice are preserved,
   thus giving the recipient permission to redistribute in turn.

   Permission is granted to distribute modified versions
   of this document, or of portions of it,
   under the above conditions, provided also that they
   carry prominent notices stating who last changed them.

Local variables:
mode: outline
paragraph-separate: "[  ]*$"
eval: (add-hook 'write-file-hooks 'time-stamp)
time-stamp-start: "changes. "
time-stamp-format: "%:y-%02m-%02d"
time-stamp-end: "\n"

A flexible mailbox archiver program based on GNU mailutils.

mbar scans the given mailbox folder for mailboxes matching a supplied pattern. For each mailbox found, a set of criteria is applied to its messages. All messages that matched the criteria are then picked and moved to the mailbox of the same name, located in the backup folder. If the destination mailbox doesn’t exist, it is created with the necessary intermediate directories.

Related projects:


Version: 1.0

A simplistic implementation of the SMTP mail transport agent, designed for testing purposes. It behaves almost identically to any real MTA, except that it listens on localhost only and delivers all messages to the given UNIX mailbox file.

Related projects:


Version: 2.1  —  2021-07-01
* Support for Guile 2.2

* Bugfixes

* Improved testsuite


An extendable socket map server with a set of modules and framework for writing new socket maps and testing them.

Related projects:


Version: 3.3  —  2021-02-12
* Fix parsing of po header fields

* Use the Language header instead of Language-Team.

Support for Language-Team and language tables is retained for
backward compatibility.

* Organizational change: repository moved to git

The repository along with links for cloning can be viewed online at

See https://puszcza.gnu.org.ua/git/?group=wyslij-po for instructions.

Wyslij-po runs basic checking on PO files given in the command line and submits them to the Translation Project robot.

Related projects: