28 个版本 (15 个稳定版)

1.0.14 2024 年 8 月 16 日
1.0.13 2024 年 6 月 3 日
1.0.12 2024 年 4 月 9 日
1.0.8 2024 年 3 月 14 日
0.5.1 2023 年 9 月 26 日

#22 in 电子邮件

Download history 49/week @ 2024-05-02 36/week @ 2024-05-09 69/week @ 2024-05-16 85/week @ 2024-05-23 172/week @ 2024-05-30 87/week @ 2024-06-06 47/week @ 2024-06-13 50/week @ 2024-06-20 21/week @ 2024-06-27 12/week @ 2024-07-04 41/week @ 2024-07-11 33/week @ 2024-07-18 34/week @ 2024-07-25 36/week @ 2024-08-01 18/week @ 2024-08-08 216/week @ 2024-08-15

每月 307 次下载
用于 6 个 crate(4 个直接使用)

MIT 和可能 LGPL-2.1

155KB
3.5K SLoC

📫 MIME 元语言

Rust 实现的 Emacs MIME 消息元语言,即 MML

此库公开了一个 MML 到 MIME 消息编译器和 MIME 到 MML 消息解释器。有关更多信息,请参阅 API 文档

例如

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>

编译为

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

定义

来自 Emacs 文档

创建 MIME 消息既无聊又复杂。因此,定义了一个名为 mml 的库,它解析称为 MML(MIME 元语言)的语言,并生成 MIME 消息。

MML 语言非常简单。它看起来有点像 SGML 应用程序,但并非如此。

MML 的主要概念是部分。每个部分可以是不同的类型或使用不同的字符集。通过使用 ‘<#part ...>’ 标签来界定部分。可以使用 ‘<#multipart ...>’ 标签引入多部分。通过 ‘<#/part>’ 或 ‘<#/multipart>’ 标签结束部分。以 ‘<#part ...>’ 标签开始的部分也通过下一个打开标签关闭。

[…]

每个标签可以包含零个或多个形式为 ‘parameter=value’ 的参数。值可以括在引号内,但除非值包含空格,否则不是必需的。因此,‘filename=/home/user/#hello$^yes’ 是完全有效的。

功能

  • 使用 MmlCompilerBuilder(需要 cargo 功能 compiler,默认启用)将 MML 编译成 MIME 消息
  • 使用 MimeInterpreterBuilder(需要 cargo 功能 interpreter,默认启用)将 MIME 解释为 MML 消息
  • 支持多个部分 <#multipart><#/multipart>
  • 内联部分支持 <#part text=mime/type><#/part>
  • 附件支持 <#part disposition=attachment filename=/path/to/attachment.ext><#/part>
  • 注释支持 <#!part>This will not be compiled<#!/part>
  • PGP 支持
    • Shell 命令(需要 cargo 功能 pgp-commands
    • GPG 绑定(需要 cargo 功能 pgp-gpggpgme 库)
    • 原生 Rust 实现(需要 cargo 功能 pgp-native

示例

参见 ./examples

cargo run --example

开发

开发环境由 Nix 管理。运行 nix-shell 将启动一个包含开始使用 lib 所需一切的 shell:cargocargo-watchrust-binrust-analyzer 等。

# Start a Nix shell
$ nix-shell

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

贡献

SourceHut 上有可用的 错误追踪器。[发送电子邮件]

SourceHut 上有可用的 邮件列表。[发送电子邮件] [订阅] [退订]

如果您想 报告一个错误,请通过 ~soywod/[email protected] 发送电子邮件。

如果您想 提出一个功能修复一个错误,请通过 ~soywod/[email protected] 发送补丁。发送补丁的最简单方法是使用 git send-email,按照 此指南 配置 git。

如果您只是想 讨论 项目,请自由加入 Matrix 工作空间 #pimalaya 或直接联系我 @soywod。您还可以使用邮件列表。

赞助

nlnet

特别感谢 NLnet 基金会欧洲委员会,他们帮助项目从 2022 年的 NGI Assure 和 2023 年的 NGI Zero Entrust 获得财务支持。

如果您欣赏这个项目,请自由使用以下任何一种方式捐赠

GitHub PayPal Ko-fi Buy Me a Coffee Liberapay

依赖项

~1–16MB
~217K SLoC