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 |
|
#83 in Asynchronous
78 downloads per month
Used in 7 crates
(5 directly)
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 runtimeasync-std
: enables the async-std async runtimerustls
: enables the rustls cryptonative-tls
: enables the native-tls cryptocompiler
: enables MML to MIME compilationinterpreter
: enables MIME to MML interpretationpgp-commands
: enables PGP using shell commandspgp-gpg
: enables PGP using GPG bindingspgp-native
: enables native PGP usingpgp-lib
command
: enables command-based secrets forpgp-native
keyring
: enables keyring-based secrets forpgp-native
derive
: enables serde supportvendored
: 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
Special thanks to the NLnet foundation and the European Commission that helped the project to receive financial support from various programs:
- NGI Assure in 2022
- NGI Zero Entrust in 2023
- NGI Zero Core in 2024 (still ongoing)
If you appreciate the project, feel free to donate using one of the following providers:
Dependencies
~1–22MB
~340K SLoC