Skip to main content

Simple mailing list software with IMAP mailbox backend, web interface, and multiple list modes.

Project description

CastMail2List

Test suites REUSE status The latest version can be found on PyPI. Information on what versions of Python are supported can be found on PyPI.

CastMail2List is a lightweight, self-hosted mailing list application. It polls standard IMAP mailboxes for incoming messages, distributes them to subscribers, and provides a web interface for list management. No MTA configuration, no complex server setup — just point it at one or more IMAP accounts and go.

Why CastMail2List?

Compared to plain email forwarding:

  • Subscriber management with a web UI and REST API
  • Two list modes: broadcast (newsletters/announcements) and group (discussion lists)
  • Sender authorization via allowed-sender lists or password-based authentication
  • Automatic bounce detection
  • Duplicate message prevention
  • Per-list IMAP accounts — each list can use its own mailbox
  • Message logs, delivery tracking, and rejection notifications

Compared to Mailman 3 or similar:

  • Minimal dependencies — runs on Python 3.10+, SQLite, and any IMAP/SMTP provider
  • No MTA integration required — works with any email provider that offers IMAP and SMTP
  • Simple YAML-based configuration
  • Hierarchical list support via nested lists (lists can subscribe to other lists)
  • Easy to deploy on shared hosting (Uberspace natively supported) or as a container
  • Single process, small footprint - suitable for personal use or small communities

CastMail2List is not a replacement for Mailman in large-scale or enterprise setups. It's designed for people who want mailing list functionality without the operational overhead of running a full mail server stack.

Features

  • Broadcast mode — one-to-many distribution (newsletters, announcements). Only authorized senders can post.
  • Group mode — many-to-many discussion lists with reply-to-list behavior.
  • Web interface — manage lists, subscribers, messages, and delivery logs.
  • REST API — programmatic subscriber management with API key authentication.
  • IMAP-based — polls mailboxes on a configurable interval; no MTA hooks needed.
  • Bounce handling — detects bounced messages and tracks per-subscriber bounce counts.
  • Sender authorization — allowed-sender lists and/or password-in-address authentication.
  • Rejection notifications — optionally notify senders when their message is rejected.
  • Nested lists — lists can include other lists as subscribers for hierarchical distribution.
  • Internationalization — UI available in English and German; extensible via standard gettext.
  • Database migrations — schema changes handled automatically via Alembic/Flask-Migrate.

Installation

From PyPI

pip install castmail2list

From source

git clone https://github.com/mxmehl/castmail2list.git
cd castmail2list
uv sync --no-dev

Quick start

  1. Create a configuration file:

    cp config.example.yaml config.yaml
    
  2. Edit config.yaml with your IMAP/SMTP credentials, database path, and other settings. See config.example.yaml for all available options.

  3. Run the application:

    For production (using gunicorn as WSGI server):

    castmail2list --config config.yaml
    

    For development and admin commands (using Flask directly):

    castmail2list-cli --config config.yaml --debug
    
  4. Access the web interface at http://localhost:2278 and log in with the credentials set in your configuration.

Run castmail2list --help or castmail2list-cli --help for all available options.

Configuration

CastMail2List is configured via a YAML file. See config.example.yaml for the full reference.

The configuration file is validated against a JSON schema (castmail2list/config_schema.json) to ensure all required fields are present and correctly formatted. This is the single source of truth for configuration options, their types, and default values. The application will fail to start if the configuration file is invalid.

Documentation

Contributing

Contributions and translations are welcome! See CONTRIBUTING.md for development setup, testing, and translation guidelines.

Copyright and Licensing

This project is mainly licensed under the Apache License 2.0, copyrighted by Max Mehl.

It also contains files from different copyright holders and under different licenses. As the project follows the REUSE best practices, you can find the according information for each individual file.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

castmail2list-0.8.1.tar.gz (401.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

castmail2list-0.8.1-py3-none-any.whl (456.7 kB view details)

Uploaded Python 3

File details

Details for the file castmail2list-0.8.1.tar.gz.

File metadata

  • Download URL: castmail2list-0.8.1.tar.gz
  • Upload date:
  • Size: 401.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for castmail2list-0.8.1.tar.gz
Algorithm Hash digest
SHA256 9ba4cdb3175d71bef7fbf131bbe11fc5deaa865ed8e4bf54a9bfee4fb7df37c4
MD5 439c2916e55b261acd17224635da0478
BLAKE2b-256 245e33c563ee99c989d6a10f7cc566c18c0eef5d5dc71edcc95db8ec71d5667d

See more details on using hashes here.

Provenance

The following attestation bundles were made for castmail2list-0.8.1.tar.gz:

Publisher: publish.yaml on mxmehl/castmail2list

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file castmail2list-0.8.1-py3-none-any.whl.

File metadata

  • Download URL: castmail2list-0.8.1-py3-none-any.whl
  • Upload date:
  • Size: 456.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for castmail2list-0.8.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d80b3c009fb38d116481b1a5cfbf6e7729d9fe65104b44d1146b238b1f2fb771
MD5 92804db640ac2775dbb45ff06def0ce7
BLAKE2b-256 7242833c2be8b158d595965476b9c09b7910679030ea31b77c54501b1d0e5bf8

See more details on using hashes here.

Provenance

The following attestation bundles were made for castmail2list-0.8.1-py3-none-any.whl:

Publisher: publish.yaml on mxmehl/castmail2list

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page