Skip to main content

Python implementation for MJML - a framework that makes responsive-email easy

Project description

mjml-python

This is an unofficial Python port of mjml v4. It is implemented in pure Python and does not require JavaScript/NodeJS. mjml is a markup language created by Mailjet and designed to reduce the pain of coding a responsive email.

Installation

pip install mjml

Usage

from mjml import mjml_to_html
with open('foo.mjml', 'rb') as mjml_fp:
    result = mjml_to_html(mjml_fp)
assert not result.errors
html: str = result.html

Alternatively you can run the code from the CLI:

$ mjml foo.mjml

Limitations

This library only implements a subset of the original MJML project. It lacks several features found in the JavaScript mjml implementation (e.g. minification, beautification and validation). Also the code likely contains many additional bugs.

The upside is that there are lot of possibilities for you to make a real difference when you improve the code :-)

Goals / Motivation

This library should track the JS version of mjml so ideally you should get the same HTML. However even under the best circumstances this library will always lag a bit behind as each change must be translated to Python manually (a mostly mechanical process).

While I like the idea behind mjml and all the knowledge about the quirks to get acceptable HTML rendering by various email clients we did not want to deploy a Node.js-based stack on our production servers. We did not feel comfortable auditing all 220 JS packages which are installed by npm install mjml (and re-doing this whenever new versions are available). Also due to data-privacy concerns we were unable to use any third-party products (i.e. MJML's API offering).

After a short spike to check the viability of a Python implementation I went ahead and wrote enough code to ensure some existing messages could be converted to mjml. Currently the library is deployed in some light production scenarios.

Another benefit of using Python is that we can integrate that in our web apps more closely. As the startup overhead of CPython is much lower than Node.js we can also generate a few mails via CLI applications without massive performance problems. CPython uses ~70ms to translate a trivial mjml template to HTML while Node.JS needs ~650ms.

Documentation

The idea is to implement the mjml XML dialect exactly like the JS implementation so eventually you should be able to use the official docs and other online resources found on mjml.io. However we are nowhere near that right now! The current code can render the "Hello World" example as well as images, tables and groups but many components remain to be reimplemented. I'd love to see your pull requests to improve the current state though.

Alternatives / Additional Resources

  • django-mjml: If deploying NodeJS is not an issue and you are using Django you could use the well established django-mjml library. That library integrates the mjml JavaScript implementation with Django templates so you can access all mjml features.
  • MJML.NET: This is an unofficial port of mjml to C# (github repo) which supports more components than this Python implementation.
  • mrml: rust implementation of mjml (github repo)
  • email-bugs is a github project which contains a lot of knowledge about rendering quirks in various email clients.
  • htmlemailcheck is a commercial offering to help you checking email rendering in various environments. I don't have any experience with their services but they provide a free knowledgebase.
  • #emailgeeks - Slack community for email marketers, designers, and developers

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

mjml-0.12.0.tar.gz (72.7 kB view details)

Uploaded Source

Built Distribution

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

mjml-0.12.0-py3-none-any.whl (66.9 kB view details)

Uploaded Python 3

File details

Details for the file mjml-0.12.0.tar.gz.

File metadata

  • Download URL: mjml-0.12.0.tar.gz
  • Upload date:
  • Size: 72.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for mjml-0.12.0.tar.gz
Algorithm Hash digest
SHA256 614397e624b115d78f9064d0f8aabceda3b522785eca8c2818ee03ffa8fdbf37
MD5 a56b34859f9c2bd860f7aa8a0beda5a5
BLAKE2b-256 0de3ab5a6fedd48eb2122030e9b4eb6fa560696eba6ec7a652dc92bdca22459d

See more details on using hashes here.

File details

Details for the file mjml-0.12.0-py3-none-any.whl.

File metadata

  • Download URL: mjml-0.12.0-py3-none-any.whl
  • Upload date:
  • Size: 66.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for mjml-0.12.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2329aa6b31237ce7309c5605e049d5c110a841218220f6af80bd9731040947da
MD5 6663a968c8d7a71aaedcb8c3ae10fcd1
BLAKE2b-256 a234389deb78f9a4f86945532572f417ea5ec68227cc4f67d3140998cfaceafb

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