#mime #message #mml #emacs #plain-text #secret-key

mml-lib

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

17 stable releases

new 1.1.1 Dec 9, 2024
1.1.0 Oct 27, 2024
1.0.14 Aug 16, 2024
1.0.13 Jun 3, 2024
0.5.1 Sep 26, 2023

#83 in Asynchronous

Download history 238/week @ 2024-08-16 74/week @ 2024-08-23 125/week @ 2024-08-30 71/week @ 2024-09-06 102/week @ 2024-09-13 141/week @ 2024-09-20 112/week @ 2024-09-27 116/week @ 2024-10-04 74/week @ 2024-10-11 36/week @ 2024-10-18 156/week @ 2024-10-25 27/week @ 2024-11-01 11/week @ 2024-11-08 22/week @ 2024-11-15 21/week @ 2024-11-22 21/week @ 2024-11-29

78 downloads per month
Used in 7 crates (5 directly)

MIT and maybe LGPL-2.1

185KB
4K SLoC

📫 mml-lib

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

Features

  • Compiles MML to MIME messages
  • Interprets MIME messages as MML
  • Supports multiple parts <#multipart><#/multipart>
  • Supports inline part <#part text=mime/type><#/part>
  • Supports attachment <#part disposition=attachment filename=/path/to/attachment.ext><#/part>
  • Supports comment <#!part>This will not be compiled<#!/part>
  • Supports tokio and async-std async runtimes
  • Supports rustls and native-tls crypto libs
  • Supports PGP: shell commands, GPG bindings or native implem with pgp-lib
  • Retrieves PGP secret keys and passphrases from shell commands or global keyring via secret-lib
  • Supports serde (de)serialization

The library comes with 13 cargo features, including 4 default ones:

  • tokio: enables the tokio async runtime
  • async-std: enables the async-std async runtime
  • rustls: enables the rustls crypto
  • native-tls: enables the native-tls crypto
  • compiler: enables MML to MIME compilation
  • interpreter: enables MIME to MML interpretation
  • pgp-commands: enables PGP using shell commands
  • pgp-gpg: enables PGP using GPG bindings
  • pgp-native: enables native PGP using pgp-lib
  • command: enables command-based secrets for pgp-native
  • keyring: enables keyring-based secrets for pgp-native
  • derive: enables serde support
  • vendored: compiles and statically link to a copy of non-Rust vendors like OpenSSL

Definition

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.

Examples

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>

<#part description="This is an attachment." filename=./examples/attachment.png><#/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; 
	boundary="17886a741fef2cb2_97a7dbff4c84bbac_3b41d60ef9e2fbfb"


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

This is a plain text part.


--17886a741fef2cb2_97a7dbff4c84bbac_3b41d60ef9e2fbfb
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

iVBORw0KGgo…

--17886a741fef2cb2_97a7dbff4c84bbac_3b41d60ef9e2fbfb--

Other examples can be found at ./examples:

cargo run --example

See the full API documentation on docs.rs.

Sponsoring

nlnet

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

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

GitHub Ko-fi Buy Me a Coffee Liberapay thanks.dev PayPal

Dependencies

~1–22MB
~340K SLoC