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
548 downloads per month
Used in 4 crates
155KB
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>
<#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;
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--
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.
Features
- MML to MIME messages compilation using
MmlCompilerBuilder
(cargo featurecompiler
required, enabled by default) - MIME to MML messages interpretation using the
MimeInterpreterBuilder
(cargo featureinterpreter
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
andgpgme
lib required) - Native Rust implementation (cargo feature
pgp-native
required)
- Shell commands (cargo feature
Examples
See ./examples
:
cargo run --example
Development
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
Contributing
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].
Sponsoring
Special thanks to the NLnet foundation and the European Commission that helped the project to receive financial support from:
- NGI Assure in 2022
- NGI Zero Untrust in 2023
If you appreciate the project, feel free to donate using one of the following providers:
Dependencies
~1–43MB
~671K SLoC