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.3  —  2024-01-05
** Fix compilation with GDBM 1.18.1

** Support for Guile version 2.2.0 and later

Support for prior versions has been withdrawn.

** anubisusr requires GnuTLS

** New configuration statement: use-pam

Used in CONTROL section, this boolean statement enables or disables
the use of the Pluggable Authentication Module interface for
accounting and session management.

** New configuration statement: identd-keyfile

Sets the name of the file with shared keys used for decryting replies
from the auth service.  It is used in traditional mode if anubis
receives an encrypted response from the client's identd server
(e.g. if they are running pidentd with encryption).

** Bugfixes

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: 9.0  —  2024-01-05
* Compatibility .mf suffix not supported any more

* Begin and end handlers must be defined using prog keyword

* Module and include search paths

Since version 8.15, if a module was not found in module search path,
the search was retried using include search path.  This is no longer
the case: the two paths serve different purposes and don't interact
in any way.  MFL modules are searched in module search path only.

* Use of Sendmail macros in run mode

Sendmail macros can be defined in run mode by placing assignments
macro=value before the script file name, e.g.:

  mailfromd --run i=123 client_addr=::1 test.mfl foo bar baz

This example defines Sendmail macro "i" to "123" and "client_addr" to
"::1".  The words "foo", "bar", and "baz" will be passed to the
main function as positional parameters.

* Full IPv6 support

This causes changes in the following MFL functions (see also "New functions",

** dns_query

 number dns_query (number TYPE, string DOMAIN; number SORT, number RESOLVE)

The semantics and possible values of the RESOLVE argument have
changed.  It used to be a boolean value.  Now its allowed values (as
defined in status.mfl module) are:

          Don't resolve hostnames to IP addresses.  This is the default.

          Resolve hostnames to IP addresses according to the address
          family of the SMTP session.  That is, use 'A' records if the
          client connected using the INET family (i.e.  connected to the
          IPv4 address), and use 'AAAA' records if the client connected
          to the IPv6 address.

          Resolve hostnames to IPv4 addresses ('A' records).

          Resolve hostnames to IPv6 addresses ('AAAA' records).

Values of these constants has been selected so that any existing
code using 0/1 as the value of this argument will work without

** primitive_resolve and resolve functions

 string primitive_resolve (string HOST; string DOMAIN, number FAMILY)
 string resolve (string HOST; string DOMAIN, number FAMILY)

The use of DOMAIN argument is deprecated.

By default the function selects the type of RR set to search for
using the address family of the SMTP connection: A is used for INET
(IPv4 addresses) and AAAA is used for INET6 (IPv6 addresses).

New argument FAMILY can be used to request particular RR type.  Its
possible values are:

          Look for 'A' or 'AAAA', depending on the connection type.
          This is the default.

          Resolve to IPv4 addresses ('A' records).

          Resolve to IPv6 addresses ('AAAA' records).

* New functions

** string is_ipstr(string S)

Returns 1 if S is a string representation of an IP address (IPv4 or

** string is_ip4str(string S)

Returns 1 if S is a string representation of an IPv4 address.

** string is_ip6str(string S)

Returns 1 if S is a string representation of an IPv6 address.

** string reverse_ipstr(string IP)

Returns a reversed representation of the IP address, suitable for
use in DNS labels.

** string tr(string SUBJ, string SET1, string SET2)

Transliterates characters in SUBJ by replacing all occurrences of the
characters found in SET1 with the positionally corresponding characters
in SET2.  Character ranges ('a-z') are allowed in both sets.  A character
range in SET1 translates to a corresponding character from the range in
SET2, e.g. tr(x, 'a-z', 'A-Z') translates string x to uppercase.

Character classes ([a-z], [[:alpha:]], etc) are allowed in SET1 and
translate to the corresponding single character from SET2, e.g.
tr(x, '[[:digit:]]', '_') replaces all decimal digits in string x with

** string dc(string SUBJ, string SET)

Deletes from SUBJ characters that appear in SET.  The syntax of SET is as
described for SET1 above.

** string sq(string SUBJ, string SET)

"Squeeze repeats".  Replaces each sequence of a repeated character
that is listed in SET, with a single occurrence of that character.

* Changes in match_cidr function.

The match_cidr function is re-implemented as a built-in.

The module match_cidr.mfl is deprecated.

* Deprecated MFL modules

The following MFL modules are deprecated.  They are retained for
backward compatibility.  Existing code using any of these will compile
and work as in previous releases, except that a warning will be
printed to draw your attention to the fact.  You are advised to remove
any uses of these modules, as they will be removed in future versions:

** match_cidr.mfl

This module is not needed any more.

** is_ip.mfl

This module defines function is_ip() which is superseded by is_ipstr()
built-in (see above).

** revip.mfl

This module defines function revip() which is superseded by
reverse_ipstr() built-in.

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.17  —  2024-01-06
* Use of TLS in pop3d and imap4d

If not explicitly specified, the TLS mode to use (ondemand, connect,
etc.) is derived from the configured port.  E.g., for imap4d, port 143
implies ondemand mode, and port 993 implies connection mode.

The global tls-mode setting is used only when the mode cannot be
detemined otherwise, i.e. neither per-server tls-mode is given nor
the port gives any clues as to the TLS mode to use.

* Bugfixes

** movemail: fix handling of -P option.
** pop3d, imap4d: fix global timeout and transcript configuration statements
** pop3d, imap4d: global tls-mode is used only when the mode to use cannot
   be determined otherwise.
** pop3d, imap4d: if not set explicitly, derive tls mode from the port used.
** Improve file safety checking routine.
** Fix compilation with new gcc versions.

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: