#mime #message #mml #emacs


Rust implementation of the Emacs MIME message Meta Language (MML)

14 releases (1 stable)

new 1.0.0 Sep 27, 2023
0.5.1 Sep 26, 2023
0.4.0 Sep 20, 2023
0.3.2 Sep 17, 2023
0.1.2 Aug 27, 2023

#256 in Email

Download history 284/week @ 2023-08-23 106/week @ 2023-08-30 81/week @ 2023-09-06 125/week @ 2023-09-13 158/week @ 2023-09-20

548 downloads per month
Used in 4 crates

MIT and maybe LGPL-2.1

3.5K SLoC

📫 MIME Meta Language

Rust implementation of the Emacs MIME message Meta Language, as known as MML.

This library exposes a MML to MIME message compiler and a MIME to MML message interpreter. See the API documentation for more information.

For example:

From: alice@localhost
To: bob@localhost
Subject: MML examples

This is a plain text part.

<#part type=text/html>
<h1>This is a HTML part.</h1>

<#part filename=./examples/attachment.png description="This is an attachment."><#/part>

compiles to:

MIME-Version: 1.0
From: <alice@localhost>
To: <bob@localhost>
Subject: MML examples
Message-ID: <17886a741feef4a2.f9706245cd3a3f97.3b41d60ef9e2fbfb@soywod>
Date: Tue, 26 Sep 2023 09:58:26 +0000
Content-Type: multipart/mixed; 

Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit

This is a plain text part.

Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: 7bit

<h1>This is a HTML part.</h1>

Content-Type: application/octet-stream
Content-Disposition: attachment; filename="attachment.png"
Content-Transfer-Encoding: base64




From the Emacs documentation:

Creating a MIME message is boring and non-trivial. Therefore, a library called mml has been defined that parses a language called MML (MIME Meta Language) and generates MIME messages.

The MML language is very simple. It looks a bit like an SGML application, but it’s not.

The main concept of MML is the part. Each part can be of a different type or use a different charset. The way to delineate a part is with a ‘<#part ...>’ tag. Multipart parts can be introduced with the ‘<#multipart ...>’ tag. Parts are ended by the ‘<#/part>’ or ‘<#/multipart>’ tags. Parts started with the ‘<#part ...>’ tags are also closed by the next open tag.


Each tag can contain zero or more parameters on the form ‘parameter=value’. The values may be enclosed in quotation marks, but that’s not necessary unless the value contains white space. So ‘filename=/home/user/#hello$^yes’ is perfectly valid.


  • MML to MIME messages compilation using MmlCompilerBuilder (cargo feature compiler required, enabled by default)
  • MIME to MML messages interpretation using the MimeInterpreterBuilder (cargo feature interpreter required, activated by default)
  • Multiple parts support <#multipart><#/multipart>
  • Inline part support <#part text=mime/type><#/part>
  • Attachment support <#part disposition=attachment filename=/path/to/attachment.ext><#/part>
  • Comment support <#!part>This will not be compiled<#!/part>
  • PGP support:
    • Shell commands (cargo feature pgp-commands required)
    • GPG bindings (cargo feature pgp-gpg and gpgme lib required)
    • Native Rust implementation (cargo feature pgp-native required)


See ./examples:

cargo run --example


The development environment is managed by Nix. Running nix-shell will spawn a shell with everything you need to get started with the lib: cargo, cargo-watch, rust-bin, rust-analyzer

# Start a Nix shell
$ nix-shell

# then build the lib
$ cargo build -p mml-lib


If you want to report a bug that does not exist yet, please send an email at ~soywod/pimalaya@todo.sr.ht.

If you want to propose a feature or fix a bug, please send a patch at ~soywod/pimalaya@lists.sr.ht using git send-email. Follow this guide to configure git properly.

If you just want to discuss about the project, feel free to join the Matrix workspace #pimalaya.mml or contact me directly @soywod. You can also use the mailing list [send an email|subscribe|unsubscribe].



Special thanks to the NLnet foundation and the European Commission that helped the project to receive financial support from:

If you appreciate the project, feel free to donate using one of the following providers:

GitHub PayPal Ko-fi Buy Me a Coffee Liberapay


~671K SLoC