Introduction

Courier is a modular multiprotocol mail server that's designed to strike a balance between reasonable performance, flexibility and features.

Features

However, it is also important to note what Courier does not have or will not support:

Requirements

Additional information

Here is a somewhat more detailed overview of Courier's less prominent features:

Upgrade path

Courier can be installed on systems that were previously running sendmail or Qmail. Please note that Courier will be able to support most major features of both servers, however Courier is not, and will never be a 100%-compatible replacement for either sendmail or Qmail. Courier does not implement several legacy features of either MTA, and there are no plans to implement them in the future. The key differences are:

A local mail delivery agent, such as procmail, should be used for maximum compatibility with sendmail.

Courier expects system mailboxes to be in the users' home directories. If your system mailboxes are all stored separately, in /var/spool/mail or somewhere else, you'll need to use a local delivery agent such as procmail.

Courier uses a filesystem lock on mailbox files, Courier does not support old-fashioned dot-locking. If you need dot-locking, use procmail or maildrop (included).

A configuration switch allows Courier to read $HOME/.qmail files, however Courier's implementation is not 100% identical to Qmail's. Courier's aliases file is also used to implement Qmail-style virtual domains. A simple Perl script can be used to convert Qmail's control/virtualdomains into aliases entries.

Courier supports Maildirs natively.

Courier can use the maildrop mail filter as a local mail delivery agent. maildrop is optional, but, if used, Courier will take advantage of certain maildrop-specific features which optimize local mail delivery.

Mail filters

Courier has hooks for optional, site-defined, mail filters. You'll have to write them yourself, though. The administrator-defined mail filters can block the message from being accepted by Courier (if messages comes in via SMTP, the SMTP server will reject it). Courier can also be configured to pause for a short period of time before attempting to deliver a message. If the mail filter detects a slew of duplicate messages coming in, the mail filter can block all future copies, and manually bounce the handful of copies from the queue. The system administrator can selectively enable filtering for any individual mail source (ESMTP, locally submitted mail, UUCP). The system administrator can also optionally enable recipient-specified mail filters. With recipient-specified mail filtering enabled, any local mail recipient can install an arbitrary mail filter to selectively accept or reject mail based on any criteria.

Currently the mail filtering API is not very well documented, but it's there.

ESMTP extensions

Courier implements AUTH, PIPELINING, DSN, SIZE, and 8BITMIME extensions to SMTP. Courier also includes a reference implementation of the experimental XVERP and XEXDATA extensions.

Courier is a closed mail relay by default. Courier cannot be accidentally configured as a completely open relay. A deliberate feat of stupidity is required for that to happen.

ESMTP BOFH

Courier does not deliver mail to domains with broken MX records. Courier also refuses to accept any mail with a return address in a domain with broken MX records.

Courier can automatically blacklist domains whose mail servers reject delivery status notifications.

Header rewriting

Courier will rewrite headers and MIME-ify messages whenever appropriate. Header rewriting logic is hardcoded in C, there is no header rewriting language as in sendmail. An interpreted language imposes a drastic speed penalty. The rewriting library is fairly simple, and the the standard rewriting rules will do for most situations.

Courier rejects messages with badly-formed or missing MIME headers. Courier rejects messages containing 8-bit characters in the headers, or messages that contain 8-bit content, but do not have the required MIME headers. Accepting malformed messages of that kind can result in Courier itself sending mail that violates the relevant RFCs, therefore Courier will simply reject improperly-formatted messages. There are well-defined RFC standards that explicitly spell out how mail containing 8-bit content or 8-bit headers should be encoded, and those standards will have to be properly implemented by anyone that wishes their mail to be accepted.

Modularity

Message scheduling, dispatching, and the actual transport mechanism are completely modularized. Different message transport mechanisms such as UUCP can be implemented in a simple plug-in fashion, however some C coding will be required.

Message scheduling

Courier supports VERPs, multiple recipients per message, and RFC1894-compliant delivery status notifications.

Load limiting

You can set a maximum number of messages to deliver simultaneously to the same host. This, in fact, is strongly encouraged so that a single nonfunctioning domain does not take up all available delivery slots. Rate limiting is implemented in the main scheduler, and applies to any transport mechanism, not just ESMTP.

Automatic restarts and garbage cleanup

Courier's scheduling engine restarts itself automatically, on a regular basis. This helps with memory fragmentation. Courier tries to restart itself during periods of system inactivity.

Smart organization of the message queue and temporary directories

Courier automatically creates subdirectories when necessary, and deletes them when they're empty. When there's a sudden peak in the number of messages added to the queue, directories used to store the messages grow in size to accomodate the additional entries. On many file systems, once those messages are deleted, the empty slack space in the directory is not reclaimed, and actually slows down subsequent directory operations. Courier automatically removes empty directories, reclaiming the slack space.

Smart installation layout

Courier's configuration script will install Courier into /usr/lib/courier by default. Everything will go into several subdirectories there: the actual binaries, configuration files, the mail queue, manual pages, and auxiliary support files. Optional configuration switches allow pretty much every major subdirectory to be relocated anywhere else. For example, the Red Hat RPM package for Courier relocates the configuration files to /etc/courier, the manual pages to /usr/man, and the mail queue to /var/spool/courier.

Mailing lists

Courier can implement both sendmail and qmail-style address aliases. De-duping of sendmail-style aliases is automatic. Courier source distribution also includes a complete mailing list manager.