A minimalistic mailing list
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bn4t 892701aa29 add bind_to and bind_to_tls config options 3 months ago
configs add bind_to and bind_to_tls config options 3 months ago
init remove unsupported ProtectClock directive 6 months ago
internal add bind_to and bind_to_tls config options 3 months ago
.gitignore add basic functionality 6 months ago
LICENSE Add license 6 months ago
Makefile add deinstallation instructions to readme 4 months ago
README.md add bind_to and bind_to_tls config options 3 months ago
go.mod update dependencies 3 months ago
go.sum update dependencies 3 months ago
main.go close servers on shutdown gracefully 6 months ago



A minimalistic mailing list

Verteilzentrum is a minimalistic mailing list following the KISS philosophy.


  • Single config file
  • Multiple lists
  • Blacklisting
  • Whitelisting
  • Configurable publishing rights


  1. Install golang (>=1.14), gcc, make and build-essential if you don’t have them already
  2. Clone the repository: git clone https://git.bn4t.me/bn4t/verteilzentrum.git
  3. Checkout the latest stable tag
  4. Make sure go is in your $PATH and run make build to build the verteilzentrum binary
  5. Run sudo make install to install verteilzentrum on your system. This will create the directories /etc/verteilzentrum (config directory) and /var/lib/verteilzentrum (data directory). Additionally the user verteilzentrum will be created.
  6. If you have systemd installed you can run sudo make install-systemd to install the systemd service. Run service verteilzentrum start to start the verteilzentrum service. Verteilzentrum will automatically run as the verteilzentrum user.

You can make certificates and private key files accessible to the verteilzentrum user with the following command:

setfacl -m u:verteilzentrum:rx /etc/letsencrypt/ 

Increasing deliverability

To increase deliverability it is recommended to set up an SPF and DMARC record.

How to use

Subscribing to a list

Send an email (content doesn’t matter) to subscribe+$list_name. E.g. subscribe+news@lists.example.com.

You will receive a confirmation email that subscribing was successful.

Unsubscribing from a list

Send an email (content doesn’t matter) to unsubscribe+$list_name. E.g. unsubscribe+news@lists.example.com.

You will receive a confirmation email that unsubscribing was successful.


By default the config is located at /etc/verteilzentrum/config.toml.

General options


The address including port on which the server should listen for non tls connections. Listens by default on


The address including port on which the server should listen for tls connections. Can be left empty if no tls certificates are configured.

Listens by default on


The hostname of the list server. If you specify a TLS certificate it has to be valid for this hostname.


SMTP read timeout in milliseconds.


SMTP write timeout in milliseconds.


Maximum incoming message size in bytes.


Path to the TLS certificate file.


Path to the corresponding private key to the TLS certificate.

To disable inbound TLS just comment out both TLS settings.


bind_to = ""
bind_to_tls = ""
hostname = "lists.example.com"
read_timeout = 100000
write_timeout = 100000
max_message_bytes = 1048576 # 1024 * 1024
tls_cert_file = "/some/path/cert.pem"
tls_key_file = "/some/path/key.pem"


Lists are represented toml tables in an array.

Table elements


The name of the list which also serves as the list address.


Array of whitelisted email addresses which are allowed to interact with the list. Supports wildcards.

If empty the whitelist is disabled.


Array of blacklisted email addresses.

Blacklisted addresses are not allowed to interact in any way with the list. Can be empty. Supports wildcards.

Important: The Blacklist has a higher priority than the whitelist.


Array of email addresses which are allowed to publish messages to the list. Supports wildcards.


name = "news@lists.example.com"
whitelist = ["*"]
blacklist = ["baduser@gmail.com"]
can_publish = ["admin@example.com"]

name = "private-list@lists.example.com"
whitelist = ["postmaster@example.com","admin@example.com"]
blacklist = []
can_publish = ["admin@example.com", "postmaster@example.com"]

For further examples take a look at the example config.

Command line flags

  • -config <config file> - The location of the config file to use. Defaults to config.toml in the working directory.
  • -datadir <data directory> - The location where all persistent data is stored. Defaults to the working directory.


Run sudo make uninstall to uninstall verteilzentrum. This will remove the verteilzentrum binary and the directories /etc/verteilzentrum and /var/lib/verteilzentrum if they are empty.

To remove the systemd service run sudo make uninstall-systemd.


Feel free to send patches to me@bn4t.me or to open pull requests on Github.


This project is licensed under the GPL version 3 and later. See the LICENSE file.