melib

GitHub license Crates.io docs.rs

Library for handling mail.

optional features

| feature flag | dependencies | notes | | ---------------------- | ----------------------------------- | ------------------------ | | imap_backend | native-tls | | | deflate_compression | flate2 | for use with IMAP | | jmap_backend | isahc, native-tls, serde_json | | | maildir_backend | notify | | | mbox_backend | notify | | | notmuch_backend | notify | | | sqlite | rusqlite | used in IMAP cache | | unicode_algorithms | unicode-segmentation | linebreaking algo etc | | vcard | | vcard parsing | | gpgme | | GPG use with libgpgme | | smtp | native-tls, base64 | async SMTP communication |

Example: Parsing bytes into an Envelope

An Envelope represents the information you can get from an email's headers and body structure. Addresses in To, From fields etc are parsed into Address types.

```rust use melib::{Attachment, Envelope};

let rawmail = r#"From: "some name" some@example.com To: "me" myself@example.com Cc: Subject: =?utf-8?Q?gratuitouslyencodedsubject?= Message-ID: h2g7f.z0gy2pgaen5m@example.com MIME-Version: 1.0 Content-Type: multipart/mixed; charset="utf-8"; boundary="bzzbzzbzz"

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

hello world. --bzzbzzbzz Content-Type: image/gif; name="testimage.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_bzzbzz--"#;

let envelope = Envelope::frombytes(rawmail.asbytes(), None).expect("Could not parse mail"); asserteq!(envelope.subject().asref(), "gratuitously encoded subject"); asserteq!(envelope.messageiddisplay().as_ref(), "h2g7f.z0gy2pgaen5m@example.com");

let body = envelope.bodybytes(rawmail.asbytes()); asserteq!(body.contenttype().tostring().as_str(), "multipart/mixed");

let bodytext = body.text(); asserteq!(bodytext.asstr(), "hello world.");

let subattachments: Vec = body.attachments(); asserteq!(subattachments.len(), 3); asserteq!(subattachments[2].contenttype().name().unwrap(), "testimage.gif"); ```