Mailman - ArchWiki

# Mailman

From ArchWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Mailman is a mailing list management system. It is used in conjunction with a mail server.

## Installation

Install the mailman3 package.

Note: mailman3 will replace mailman in the near future. As both applications make use of `/var/lib/mailman` as state directory and the `mailman` user, they currently conflict and can not be installed alongside each other.

Mailman can be used in conjunction with Postorius (for configuration) and Hyperkitty (for archiving).

Note: Mailman runs as a dedicated `mailman` user, therefore any calls to the `mailman` executable have to be done as the `mailman` user.

## Configuration

All configuration for Mailman takes place in `/etc/mailman.cfg`. The schema explaining all possible configuration options and setting the defaults is stored in `/usr/lib/python3.8/site-packages/mailman/config/schema.cfg`.

The configuration is also accessible via the command line. Run the following command as the `mailman` user (e.g. using sudo or su):

    [mailman]$ mailman conf

### Database

Mailman by default uses an SQLite database in `/var/lib/mailman/data/`, but can be configured to use MariaDB or PostgreSQL.

#### SQLite

The default location for the SQLite database is already reflected in the `schema.cfg` and therefore does not have to be set in Mailman's configuration.

    /etc/mailman.cfg

    [database]
    url: sqlite:////var/lib/mailman/data/mailman.db

#### MariaDB

Install the python-pymysql package and configure a database on MariaDB.

    /etc/mailman.cfg

    [database]
    class: mailman.database.mysql.MySQLDatabase
    url: mysql+pymysql://myuser:mypassword@mymysqlhost/mailman?charset=utf8&use_unicode=1

#### PostgreSQL

Install the python-psycopg2 package and create a database using PostgreSQL.

    /etc/mailman.cfg

    [database]
    class: mailman.database.postgresql.PostgreSQLDatabase
    url: postgres://myuser:mypassword@mypghost/mailman

### REST API

Mailman exposes its REST API based on the settings in the `[webservice]` section of the configuration. Make sure to replace the default values for `admin_user` and `admin_pass` (do not use the example values below).

    /etc/mailman.cfg

    [webservice]
    admin_user: my_new_admin_user_name
    admin_pass: my_new_admin_user_password

### ARC

By default DMARC and DKIM are disabled. The configuration takes place in the `[ARC]` section of the configuration file. Make sure to set necessary values and read the documentation about the defaults.

    /etc/mailman.cfg

    [ARC]
    enabled: yes
    authserv_id: mailserver.tld
    trusted_authserv_ids: subdomain.mailserver.tld, other.mailserver.tld
    privkey: /path/to/privatekey.pem
    selector: test
    domain: mailserver.tld

### MTA

To connect a mail-transfer-agent (MTA), it is necessary to configure the `[mta]` section in the configuration file. Upstream documentation covers examples for postfix, exim and sendmail, but other MTAs are technically possible.

#### Postfix

To connect to a local postfix instance the following configuration section can be used:

    /etc/mailman.cfg

    [mta]
    incoming: mailman.mta.postfix.LMTP
    outgoing: mailman.mta.deliver.deliver
    lmtp_host: mail.example.com
    lmtp_port: 8024
    smtp_host: mail.example.com
    smtp_port: 25

The postfix configuration has to be extended to ensure compatibility (see upstream notes).

    /etc/postfix/main.cf

    [..]
    recipient_delimiter = +
    unknown_local_recipient_reject_code = 550
    owner_request_special = no
    [..]

Additionally, postfix needs to be made aware of mailman's transport maps. Depending on the postfix configuration these may look similar to the following.

Note: The following examples assume that existing values for `transport_maps`, `local_recipient_maps`, `relay_domains`, `virtual_mailbox_domains` and `virtual_alias_maps` are merged with the additional values.

    /etc/postfix/main.cf

    [..]
    transport_maps = hash:/var/lib/mailman/data/postfix_lmtp
    local_recipient_maps = hash:/var/lib/mailman/data/postfix_lmtp
    relay_domains = hash:/var/lib/mailman/data/postfix_domains
    [..]

If `postmap` is not directly accessible by mailman for creating the default hash-based alias maps, it is possible to generate regular expression based alias maps instead. To overwrite the default Python-class based configuration, mailman allows the use of a configuration file. Create the following file:

    /etc/postfix-mailman.cfg

    [postfix]
    postmap_command: /usr/bin/postmap
    transport_file_type: regex

Add the file to the `[mta]` section in mailman's configuration file.

    /etc/mailman.cfg

    [mta]
    [..]
    configuration: /etc/postfix-mailman.cfg

Afterwards the `regexp` based exports can then be used in the postfix configuration.

    /etc/postfix/main.cf

    [..]
    transport_maps = regexp:/var/lib/mailman/data/postfix_lmtp
    local_recipient_maps = regexp:/var/lib/mailman/data/postfix_lmtp
    relay_domains = regexp:/var/lib/mailman/data/postfix_domains
    [..]

Note: Make sure to create the new alias maps after changing their type (e.g. from `hash` to `regexp`): `[mailman]$ mailman aliases`

To connect to a local postfix instance with a virtual mail setup, first set an alias domain. Afterwards alter the respective configuration.

    /etc/postfix/main.cf

    [..]
    local_recipient_maps = regexp:/var/lib/mailman/data/postfix_lmtp
    transport_maps = regexp:/var/lib/mailman/data/postfix_lmtp
    virtual_mailbox_domains = regexp:/var/lib/mailman/data/postfix_domains
    virtual_alias_maps = regexp:/var/lib/mailman/data/postfix_vmap
    [..]

## Running

Enable and start `mailman3.service`.

Several systemd services with timers exist, taking care of various aspects of the list management:

- `mailman3-digests.timer`: for sending out daily digests to subscribers
- `mailman3-gatenews.timer`: for hourly polling of NNTP servers for news
- `mailman3-notify.timer`: for sending out daily notifications to admins about pending requests

## Setup

### Integrate with a mail server

This article or section needs expansion.

Reason: Example for setup with mail server (based on upstream documentation). (Discuss in Talk:Mailman#)

### Integrate with Hyperkitty

Mailman does not automatically archive mails on its own. The Hyperkitty web application is used for this purpose. Based on a plugin, mailman is able to send mails to a Hyperkitty instance for archival.

Install the mailman3-hyperkitty package and configure `/etc/mailman-hyperkitty.cfg`.

    /etc/mailman-hyperkitty.cfg

    [general]
    base_url: https://example.tld/hyperkitty/
    api_key: super_secret_password

Afterwards, make mailman aware of the plugin:

    /etc/mailman.cfg

    [archiver.hyperkitty]
    class: mailman_hyperkitty.Archiver
    enable: yes
    configuration: /etc/mailman-hyperkitty.cfg

## Tips and tricks

### Migrate from mailman < 3.0

Mailman offers the possibility of importing mailman < 3.0 based list databases (`config.pck`). Run the following command as the `mailman` user (e.g. using sudo or su):

    [mailman]$ mailman import21 LISTSPEC PICKLE_FILE

Here, `LISTSPEC` represents a fully-qualified name of a list to import (e.g. `list@example.com`) and `PICKLE_FILE` the path to the list's `config.pck` file.

Note: The mailman2 list to be imported must already exist on the target mailman instance.

### REST API

Mailman exposes a REST API, which can be interfaced using custom tooling, based on python-mailmanclient.

## See also

- Mailman Documentation - The upstream documentation
- Mailmanclient Documentation - The upstream documentation
- Connecting to Mailman - The upstream documentation on mailman3-hyperkitty
- Mailman Suite Documentation - The (high level) upstream documentation for the entire Mailman Suite (Mailman, Hyperkitty and Postorius)

Categories:

- Email
- Mail server

Hidden category:

- Pages or sections flagged with Template:Expansion