19 个版本

0.8.7 2024 年 7 月 30 日
0.8.5 2024 年 5 月 6 日
0.8.5-rc.32023 年 12 月 11 日
0.8.4 2023 年 11 月 23 日
0.0.0 2019 年 8 月 25 日

#60 in 电子邮件

Download history 177/week @ 2024-05-06 23/week @ 2024-05-13 42/week @ 2024-05-20 20/week @ 2024-05-27 171/week @ 2024-06-03 59/week @ 2024-06-10 35/week @ 2024-06-17 42/week @ 2024-06-24 15/week @ 2024-07-01 17/week @ 2024-07-08 13/week @ 2024-07-15 4/week @ 2024-07-22 168/week @ 2024-07-29 28/week @ 2024-08-05 26/week @ 2024-08-12

每月 226 次下载
用于 meli

GPL-3.0-or-later

2.5MB
53K SLoC

melib

GitHub license Crates.io docs.rs

处理邮件的库。

可选功能

功能标志 依赖项 说明
smtp native-tls, base64 异步 SMTP 通信
------------------------------ ------------------------------------- --------------------------
imap native-tls
------------------------------ ------------------------------------- --------------------------
jmap isahc, native-tls, serde_json
------------------------------ ------------------------------------- --------------------------
maildir notify
------------------------------ ------------------------------------- --------------------------
mbox notify
------------------------------ ------------------------------------- --------------------------
notmuch notify
------------------------------ ------------------------------------- --------------------------
sqlite rusqlite 用于 IMAP 缓存。
------------------------------ ------------------------------------- --------------------------
vcard vcard 解析
------------------------------ ------------------------------------- --------------------------
gpgme 使用 libgpgme 的 GPG
------------------------------ ------------------------------------- --------------------------

示例:将字节解析为 Envelope

Envelope 表示您可以从电子邮件的标题和正文结构中获得的信息。例如,在 ToFrom 字段等中的地址被解析为 Address 类型。

use melib::{Attachment, Envelope};

let raw_mail = r#"From: "some name" <[email protected]>
To: "me" <[email protected]>
Cc:
Subject: =?utf-8?Q?gratuitously_encoded_subject?=
Message-ID: <[email protected]>
MIME-Version: 1.0
Content-Type: multipart/mixed; charset="utf-8";
 boundary="bzz_bzz__bzz__"

This is a MIME formatted message with attachments. Use a MIME-compliant client to view it properly.
--bzz_bzz__bzz__

hello world.
--bzz_bzz__bzz__
Content-Type: image/gif; name="test_image.gif"; charset="utf-8"
Content-Disposition: attachment
Content-Transfer-Encoding: base64

R0lGODdhKAAXAOfZAAABzAADzQAEzgQFtBEAxAAGxBcAxwALvRcFwAAPwBcLugATuQEUuxoNuxYQ
sxwOvAYVvBsStSAVtx8YsRUcuhwhth4iuCQsyDAwuDc1vTc3uDg4uT85rkc9ukJBvENCvURGukdF
wUVKt0hLuUxPvVZSvFlYu1hbt2BZuFxdul5joGhqlnNuf3FvlnBvwXJyt3Jxw3N0oXx1gH12gV99
z317f3N7spFxwHp5wH99gYB+goF/g25+26tziIOBhWqD3oiBjICAuudkjIN+zHeC2n6Bzc1vh4eF
iYaBw8F0kImHi4KFxYyHmIWIvI2Lj4uIvYaJyY+IuJGMi5iJl4qKxZSMmIuLxpONnpGPk42NvI2M
1LKGl46OvZePm5ORlZiQnJqSnpaUmLyJnJuTn5iVmZyUoJGVyZ2VoZSVw5iXoZmWrO18rJiUyp6W
opuYnKaVnZ+Xo5yZncaMoaCYpJiaqo+Z2Z2annuf5qGZpa2WoJybpZmayZ2Z0KCZypydrZ6dp6Cd
oZ6a0aGay5ucy5+eqKGeouWMgp+b0qKbzKCfqdqPnp2ezaGgqqOgpKafqrScpp+gz6ajqKujr62j
qayksKmmq62lsaiosqqorOyWnaqqtKeqzLGptaurta2rr7Kqtq+ssLOrt6+uuLGusuqhfbWtubCv
ubKvs7GwurOwtPSazbevu+ali7SxtbiwvOykjLOyvLWytuCmqOankrSzvbazuLmyvrW0vre0uba1
wLi1ury0wLm2u721wbe3wbq3vMC2vLi4wr+3w7m5w8C4xLi6yry6vsG5xbu7xcC6zMK6xry8xry+
u8O7x729x8C9wb++yMG+wsO+vMK/w8a+y8e/zMnBzcXH18nL2///////////////////////////
////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////ywAAAAAKAAXAAAI/gBP4Cjh
IYMLEh0w4EgBgsMLEyFGFBEB5cOFABgzatS4AVssZAOsLOHCxooVMzCyoNmzaBOkJlS0VEDyZMjG
mxk3XOMF60CDBgsoPABK9KcDCRImPCiQYAECAgQCRMU4VSrGCjFarBgUSJCgQ10FBTrkNRCfPnz4
dA3UNa1btnDZqgU7Ntqzu3ej2X2mFy9eaHuhNRtMGJrhwYYN930G2K7eaNIY34U2mfJkwpgzI9Yr
GBqwR2KSvAlMOXHnw5pTNzPdLNoWIWtU9XjGjDEYS8LAlFm1SrVvzIKj5TH0KpORSZOryPgCZgqL
Ob+jG0YVRBErUrOiiGJ8KxgtYsh27xWL/tswnTtEbsiRVYdJNMHk4yOGhswGjR88UKjQ9Ey+/8TL
XKKGGn7Akph/8XX2WDTTcAYfguVt9hhrEPqmzIOJ3VUheb48WJiHG6amC4i+WVJKKCimqGIoYxyj
WWK8kKjaJ9bA18sxvXjYhourmbbMMrjI+OIn1QymDCVXANGFK4S1gQw0PxozzC+33FLLKUJq9gk1
gyWDhyNwrMLkYGUEM4wvuLRiCiieXIJJJVlmJskcZ9TZRht1lnFGGmTMkMoonVQSSSOFAGJHHI0w
ouiijDaaCCGQRgrpH3q4QYYXWDihxBE+7KCDDjnUIEVAADs=
--bzz_bzz__bzz__--"#;

let envelope = Envelope::from_bytes(raw_mail.as_bytes(), None).expect("Could not parse mail");
assert_eq!(envelope.subject().as_ref(), "gratuitously encoded subject");
assert_eq!(envelope.message_id_display().as_ref(), "<[email protected]>");

let body = envelope.body_bytes(raw_mail.as_bytes());
assert_eq!(body.content_type().to_string().as_str(), "multipart/mixed");

let body_text = body.text();
assert_eq!(body_text.as_str(), "hello world.");

let subattachments: Vec<Attachment> = body.attachments();
assert_eq!(subattachments.len(), 3);
assert_eq!(subattachments[2].content_type().name().unwrap(), "test_image.gif");

依赖项

~17–36MB
~649K SLoC