Skip to main content

Typed Python CLI for administering Postfix + Dovecot mail servers (PostfixAdmin schema). Pluggable identity backend.

Project description

postino

CLI tool to administer a Postfix + Dovecot mail server with the PostfixAdmin SQL schema as user/alias/domain backend.

Pluggable identity backend (local password column or external IdP via Zitadel/SCIM). Built for FreeBSD mail hosts but portable.

Status

MVP shipping. Design spec: docs/superpowers/specs/2026-05-09-postino-design.md.

Requires Python 3.13+.

Install

pipx install il-postino

Import name remains postino. The PyPI distribution is published as il-postino because the bare postino name is squatted by an unrelated 2017 package.

From git (mail host / production)

git clone https://github.com/vjt/postino.git /usr/local/src/postino
cd /usr/local/src/postino
python3.13 -m venv .venv
. .venv/bin/activate
pip install .
ln -s /usr/local/src/postino/.venv/bin/postino /usr/local/bin/postino

# update later: cd /usr/local/src/postino && git pull && .venv/bin/pip install .

Usage

# All commands inherit POSTINO_* env vars or read /usr/local/etc/postino/postino.toml

postino domain add example.com --max-mailboxes 100 --default-quota 5G
postino user add foo@example.com --password 'hunter2' --name "Foo Bar" --quota 5G
postino user list --domain example.com --json
postino alias add foo@example.com forwarded@elsewhere.test
postino quota show foo@example.com
postino check
postino status

Configuration

postino reads /usr/local/etc/postino/postino.toml. Example:

identity_backend = "local"
postfix_sql_dir = "/usr/local/etc/postfix"
virtual_mailbox_base = "/srv/mail"
postcreation_hook = "/usr/local/sbin/postfixadmin-mailbox-postcreation.sh"
vmail_uid = 1006
vmail_gid = 1006
default_password_scheme = "BLF-CRYPT"
default_quota_bytes = 1073741824

DB credentials are NOT duplicated here — postino parses /usr/local/etc/postfix/sql-virtual_mailbox_maps.cf to extract them.

Development

Set up a test MySQL/MariaDB schema (see docs/superpowers/plans/2026-05-09-postino-mvp.md § Test Database Prerequisites for the DDL), then:

python3.13 -m venv .venv
. .venv/bin/activate
pip install -e '.[dev]'
export POSTINO_TEST_DB_URL='mysql+pymysql://postino_test:postino_test_dev@localhost/postino_test'
./scripts/check.sh

License

MIT — see LICENSE.

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

il_postino-0.1.0.tar.gz (37.8 kB view details)

Uploaded Source

Built Distribution

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

il_postino-0.1.0-py3-none-any.whl (30.8 kB view details)

Uploaded Python 3

File details

Details for the file il_postino-0.1.0.tar.gz.

File metadata

  • Download URL: il_postino-0.1.0.tar.gz
  • Upload date:
  • Size: 37.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for il_postino-0.1.0.tar.gz
Algorithm Hash digest
SHA256 f07fe812cf42d1763ccff81f595880a5afcb140e6ea56213edb47ad554360688
MD5 faf77e79586c251df83dea2a496a518d
BLAKE2b-256 2714bc00966a6e798c1e16708414d78d409d775adb7663bbf1b4a9c35f45e3e4

See more details on using hashes here.

File details

Details for the file il_postino-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: il_postino-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 30.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for il_postino-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f3c8d24d199074932645c4f61e78d1b0187561d87f37838256a9821523adb431
MD5 2070682d98d585aa2609a4f6236f07d0
BLAKE2b-256 88bf90bb1df27e4db1486308f593ac226204ac594e4e8722318aac7b990a04f1

See more details on using hashes here.

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