mml-lib

Crates.iomml-lib
lib.rsmml-lib
version1.1.0
sourcesrc
created_at2023-08-23 13:23:07.132979
updated_at2024-10-27 13:21:11.74011
descriptionRust implementation of the Emacs MIME message Meta Language (MML)
homepagehttps://pimalaya.org/
repositoryhttps://github.com/pimalaya/core/tree/master/mml/
max_upload_size
id952025
size280,362
Clément DOUIN (soywod)

documentation

https://docs.rs/mml-lib/latest/mml/

README

📫 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

Commit count: 0

cargo fmt