This release is a pre-release and may not be stable for production use.
<img src="https://raw.githubusercontent.com/IMIO/imio.emailkit/main/docs/banner.png" alt="A transactional email rendered by imio.emailkit: the Délibérations.be masthead over a white card, an 'À relire' status pill, and a notification asking a section editor to review a page submitted for publication." width="640"
imio.emailkit
Transactional email templating for the iMio Plone ecosystem. Author HTML mails with a modern toolchain — Maizzle 6 (Vue SFC + Tailwind CSS 4) — and render them at runtime with Chameleon, so that no Node.js ever runs in production.
Installing it restyles Plone's stock password-reset, registration and username-reminder mails immediately. That is the point: the mails a citizen actually receives from a commune are the ones nobody ever gets round to designing.
📖 Documentation
https://imio.github.io/imio.emailkit/
Everything is there: the quickstart, the architecture, the full API reference, the template-authoring rules, how to ship templates from your own add-on, and how to override what this package ships.
Some entry points worth naming:
| Quickstart | install, then send your first styled mail |
| Architecture | the build-time / runtime seam, and why |
Email builder |
recipients, attachments, per-language sending |
| Authoring rules | eight ways a template breaks with a green build |
| Shipping templates | get your own add-on's templates discovered |
| Migrating a mail | you already build HTML bodies |
| Overrides & theming | three levels, plus a full opt-out |
Installation
pip install imio.emailkit
Then install the add-on in Site Setup, or apply the imio.emailkit:default
GenericSetup profile — which restyles Plone's own transactional mails. Use
imio.emailkit:base for the runtime only.
[!IMPORTANT] Behind a reverse proxy, declare
trusted-proxyinzope.conf, or the login-help mails will name the proxy's own IP address instead of the client's. Why, and why the header is not read directly: Installation & profiles.
from imio.emailkit import Email
Email("imio.emailkit:notification").to(member).with_context(
title=title, intro=intro, cta_url=url
).send()
Compatibility
Plone 6.0, 6.1 and 6.2 on Python 3.10 to 3.13.
[!IMPORTANT] Classic UI only, and deliberately so. These are emails: there is no Volto component and no REST endpoint to write. Rendering is isolated in
imio.emailkit.render, which has no dependency on the request.
[!NOTE] Building templates needs Node.js 22+. Installing, testing and running the add-on never does — that is the whole architecture. If you only consume the mails it ships, you will never install Node.
Contribute
Prerequisites ✅
- An operating system that runs all the requirements mentioned.
- uv
- Make
- Git
- Node.js 22+ — only to build email templates
Installation 🔧
-
Clone this repository, then change your working directory.
git clone git@github.com:IMIO/imio.emailkit.git cd imio.emailkit
-
Install this code base.
make install
Run make help for every target. The ones you will reach for most: make test,
make check (format then lint), make start, make create-site,
make build-emails, make check-emails, make preview-emails.
The design record
This README and the documentation site describe what the package does.
docs/DECISIONS.md describes why, and it is the authority
when the two disagree: every measured finding, every reverted attempt, every
"this looked like it worked".
Comments throughout the code cite a SPEC.md by section number (§4, §6.2, §7).
That file is no longer in the repository; the citations are kept as stable names
for the contracts they refer to, and DECISIONS.md is where the reasoning behind
each one actually lives.
SKILL.md carries the authoring conventions for AI-assisted work,
which is how much of the template work here is done.
The documentation site itself lives in docs/site/ — see
its README for how to add a page.
License
The project is licensed under GPLv2.
Metadata
Release files for imio.emailkit 1.0.0b1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| imio_emailkit-1.0.0b1.tar.gz | 514.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| imio_emailkit-1.0.0b1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 878.8 kB
Release files / imio_emailkit-1.0.0b1.tar.gz
| Download URL | imio_emailkit-1.0.0b1.tar.gz |
|---|---|
| Size | 514.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
abb73cc4209c9e7b509ccc1993a70c6f37a1a69c754a865bbf947fe89ce6b9d2
|
|
BLAKE2b-256 checksum How to use checksums |
189d42d306177d97399637fa0d578eb7dbb33974802bfea7d9f4c46cbcc3159b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.12
|
Release files / imio_emailkit-1.0.0b1-py3-none-any.whl
| Download URL | imio_emailkit-1.0.0b1-py3-none-any.whl |
|---|---|
| Size | 364.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
56afe757fa20a239ee194283e177b579bb6485eceb2a51d16dcde6d37710adef
|
|
BLAKE2b-256 checksum How to use checksums |
0338b63b3a20fa0aa6bb0a7dff9825c4262be66e8c27a1d48d778b40d184ab37
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.12
|