Skip to main content

really simple mailing lists

pypi license pypi status pypi version github actions workflow status (publish) github actions workflow status (tests) github actions workflow status (ghcr push)

a small, self-hosted mailing list system.

rsml is a mailing list manager system written in python built with minimalism in mind, it does not try to be a GNU Mailman competitor but rather a simpler alternative.

features

  • toml-based configuration (rsml.toml) (rsml.config)
  • RFC 4155 and mboxrd compliant .mbox file generator (rsml.mbox)
  • mailing list posting via LMTP
  • two-step subscription via /list/subscribe and /list/verify
  • /list/archive endpoint for .mbox archive retrieval of the mailing list
  • one-click unsubscribe with List-Unsubscribe and List-Unsubscribe-Post (RFC 8058)

quick start

rsml can be run directly with python or as a container using an OCI-compatible runtime.

  1. create a configuration
cp rsml.toml.example rsml.toml # copy the example configuration
${EDITOR:-nano} rsml.toml # modify the configuration file

at minimum, configure the server secret. see rsml.toml.example for the available options.

  1. run rsml

2.1 with python

pip install rsml # install rsml and dependencies

start the http server:

rsml http

in a separate process, start the lmtp server:

rsml lmtp

2.2 with a container

alternatively, rsml can be run from its OCI container image using podman, docker, or another OCI-compatible runtime.

example (with podman)

podman run --rm -it \
  -p 8080:8080 \
  -v "$PWD/rsml.toml:/home/rsml/rsml.toml:ro" \
  ghcr.io/juanvel4000/rsml:latest \
  http

and for the lmtp server

podman run --rm -it \
  -p 8024:8024 \
  -v "$PWD/rsml.toml:/home/rsml/rsml.toml:ro" \
  ghcr.io/juanvel4000/rsml:latest \
  lmtp
  1. configure your mta

rsml receives mailing-list messages through LMTP. configure your mta to deliver messages destined for the mailing list to the rsml lmtp server.

set relay_host and relay_port in rsml.toml to the hostname and port of the mta used by rsml for outgoing mail.

dependencies

rsml requires at least

  • a python >=3.11-compatible interpreter

a complete deployement requires

  • an mta capable of receiving mail and delivering messages to rsml over LMTP

runtime dependencies include

  • aiosmtpd/aiosmtplib: for asynchronous SMTP/LMTP operations
  • flask: for the http server
  • email-validator: to validate email addresses

development-time dependencies include:

  • pytest/pytest-asyncio: to execute the unit tests

usage

pip install -e . # install rsml and dependencies
cp rsml.toml.example rsml.toml # edit server_secret, etc.
rsml http # start the http server
rsml lmtp # start the lmtp server

running the test suite can be done with pytest

pip install -e ".[dev]" # install dev dependencies
pytest -vs . # run the unit tests

redis support for the rate limiter requires the redis optional dependency set to be installed

pip install -e ".[redis]"

spec

a document outlining the technical specifications of the project can be found in this repository as SPEC.md

project status

rsml is in active development. while functional, it is not yet production-ready for real-world usage.

license

BSD-3-Clause -- see LICENSE

Release files for rsml 0.3.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for rsml 0.3.1
File Size Uploaded
rsml-0.3.1.tar.gz 22.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for rsml 0.3.1
File Interpreter ABI Platform
rsml-0.3.1-py3-none-any.whl Python 3 none any Details

Total release size: 36.0 kB

Release files / rsml-0.3.1.tar.gz

Download URL rsml-0.3.1.tar.gz
Size 22.1 kB
Tags Source
SHA-256 checksum
How to use checksums
646b2dac6cb796c8ef3674169ce2f5f25de31190afadfbad3f4678c14e4f0221
BLAKE2b-256 checksum
How to use checksums
bb1ffb77061f3c1a2edba1e6332287d1f5971927f541985ec25d9be451a2b572
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.

Transparency log

Release files / rsml-0.3.1-py3-none-any.whl

Download URL rsml-0.3.1-py3-none-any.whl
Size 13.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
638b4f2911eadfa7da7c0a7a97ed3970c7d6495d44e400c237638bde0527a2ed
BLAKE2b-256 checksum
How to use checksums
a3b893eb7702f8ca66ccd831ab6bef9add9c2394e7c1488abbae7c005de9df91
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 26, 2026.

Transparency log

Release history Release notifications | RSS feed

0.3.2

2 release files

This release

0.3.1 This release

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.2

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page