imio.emailkit
Transactional email templating for the iMio Plone ecosystem. Author HTML mails with a modern toolchain — Maizzle 6, which is Vue SFC plus 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.
What you get
- Better defaults out of the box. The
imio.emailkit:defaultprofile restyles Plone's password-reset, user-registration and username-reminder mails, with no extra package and no opt-in step. - A two-stage pipeline with a build-time seam. Maizzle compiles
.vueinto email-safe HTML — inlined CSS, Outlook fallbacks — and the output is committed as.ptand rendered by Chameleon at runtime. Node is a developer and CI tool only. - A design system shipped inside the egg, so the buildout pin that governs the runtime governs the design system too. No npm registry, no version skew.
render(name, context, language)returning(html, text): a pure function of template, context and registry state, so previews, tests and real sends all take the same path.- Locale-aware helpers bound to the render language, so no template reinvents French date formatting.
- Accessibility and i18n baked into the kit, not left to authors:
role="presentation"on layout tables, an enforcedalton images,langon<html>, and the hidden preheader line every inbox shows next to the subject. - Three levels of override, from a registry record to a full markup replacement, plus a complete opt-out.
Compatibility
Plone 6.0, 6.1 and 6.2 on Python 3.10 to 3.13.
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.
Building templates needs Node.js 22 or newer. 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.
Start here
render()
Turn a registered template plus a context into an HTML part and a plaintext part. A pure function — previews, tests and real sends all take this path.
Email builder
Recipients, attachments, per-language sending and transaction-safe delivery, in one chained expression.
The design kit
The canonical shell and the three components every iMio mail is built from, shipped inside the egg.
Shipping templates
Declare one entry point and your own add-on’s templates become discoverable, previewable and sendable.
Guides
Migrating a mail
Get the styled shell around a body you already build, without re-authoring it.