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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f07fe812cf42d1763ccff81f595880a5afcb140e6ea56213edb47ad554360688
|
|
| MD5 |
faf77e79586c251df83dea2a496a518d
|
|
| BLAKE2b-256 |
2714bc00966a6e798c1e16708414d78d409d775adb7663bbf1b4a9c35f45e3e4
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f3c8d24d199074932645c4f61e78d1b0187561d87f37838256a9821523adb431
|
|
| MD5 |
2070682d98d585aa2609a4f6236f07d0
|
|
| BLAKE2b-256 |
88bf90bb1df27e4db1486308f593ac226204ac594e4e8722318aac7b990a04f1
|