diff --git a/Cargo.toml b/Cargo.toml index a4a64f9..a4df585 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,13 @@ [package] -name = "email-message" +name = "cow-mail" version = "0.0.1" authors = ["Thomas Oettli "] edition = "2024" +description = "Parse, modify and serialize email messages (RFC 5322/MIME) with copy-on-write, byte-exact round-trip" +repository = "https://github.com/spacefreak86/cow-mail" +license = "GPL-3.0-only" +keywords = ["email", "mime", "rfc5322", "parser", "cow"] +categories = ["email", "parser-implementations"] [profile.release] lto = true diff --git a/README.md b/README.md index 15ff187..9fa9645 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# email-message +# cow-mail A Rust library for parsing, modifying and serializing email messages (RFC 5322 / MIME). @@ -14,7 +14,7 @@ messages and for anything that has to pass a message through unchanged. ## Quickstart ```rust -use email_message::{CowMail, HeaderMap, Mail}; +use cow_mail::{CowMail, HeaderMap, Mail}; let raw = b"Subject: Hello\r\n\ Content-Type: text/plain\r\n\ @@ -31,7 +31,7 @@ assert_eq!(mail.get_content().unwrap(), "Hi there"); assert_eq!(mail.serialize().concat(), raw.to_vec()); // Modify it. -mail.add_header("X-Mailer", "email-message"); +mail.add_header("X-Mailer", "cow-mail"); mail.set_text_body("Hi again").unwrap(); let out: Vec = mail.serialize().concat(); @@ -41,7 +41,7 @@ assert!(out.starts_with(b"Subject: Hello")); Building a multipart message from scratch: ```rust -use email_message::{CowMail, HeaderMap, Mail, MediaType, names}; +use cow_mail::{CowMail, HeaderMap, Mail, MediaType, names}; let mut mail = CowMail::default(); mail.add_header("Subject", "Report"); diff --git a/src/body.rs b/src/body.rs index 582a9e7..69c62e6 100644 --- a/src/body.rs +++ b/src/body.rs @@ -94,7 +94,7 @@ impl From for Vec { /// # Examples /// /// ``` -/// use email_message::{ContentTransferEncoding, body::encode}; +/// use cow_mail::{ContentTransferEncoding, body::encode}; /// /// // Plain ASCII needs no encoding at all. /// let (bytes, encoding) = encode("hello"); diff --git a/src/header/encoding.rs b/src/header/encoding.rs index d3177f6..49586e1 100644 --- a/src/header/encoding.rs +++ b/src/header/encoding.rs @@ -41,7 +41,7 @@ fn encode(encode_buf: &mut String, writer: &mut EmailWriter) { /// # Examples /// /// ``` -/// use email_message::header::encode_header_value; +/// use cow_mail::header::encode_header_value; /// /// // Plain text is left alone. /// assert_eq!(encode_header_value("Subject", "a test"), "a test"); diff --git a/src/header/headers.rs b/src/header/headers.rs index fe1cf79..d25a208 100644 --- a/src/header/headers.rs +++ b/src/header/headers.rs @@ -42,7 +42,7 @@ pub trait HeaderMap<'a, H: Header<'a> + 'a> { /// /// # Examples /// ``` - /// use email_message::{CowMail, HeaderMap}; + /// use cow_mail::{CowMail, HeaderMap}; /// let mail = CowMail::try_from(concat!( /// "Subject: Test\n", /// "Subject: Test1\n", @@ -80,7 +80,7 @@ pub trait HeaderMap<'a, H: Header<'a> + 'a> { /// /// # Examples /// ``` - /// use email_message::{CowMail, HeaderMap}; + /// use cow_mail::{CowMail, HeaderMap}; /// let mail = CowMail::try_from(concat!( /// "Subject: Test\n", /// "Subject: Test1", @@ -104,7 +104,7 @@ pub trait HeaderMap<'a, H: Header<'a> + 'a> { /// /// # Examples /// ``` - /// use email_message::{CowMail, HeaderMap}; + /// use cow_mail::{CowMail, HeaderMap}; /// let mut mail = CowMail::default(); /// mail.add_header("Subject", "Test"); /// assert_eq!(mail.find_value("Subject").unwrap(), "Test"); @@ -124,7 +124,7 @@ pub trait HeaderMap<'a, H: Header<'a> + 'a> { /// /// # Examples /// ``` - /// use email_message::{CowMail, Header, HeaderMap}; + /// use cow_mail::{CowMail, Header, HeaderMap}; /// let mut mail = CowMail::try_from(concat!( /// "Subject: Test\n", /// "To: \"John Doe\" \n", @@ -153,7 +153,7 @@ pub trait HeaderMap<'a, H: Header<'a> + 'a> { /// /// # Examples /// ``` - /// use email_message::{CowMail, Header, HeaderMap}; + /// use cow_mail::{CowMail, Header, HeaderMap}; /// let mut mail = CowMail::try_from(concat!( /// "Subject: Test1\n", /// "To: \"John Doe\" \n", @@ -192,7 +192,7 @@ pub trait HeaderMap<'a, H: Header<'a> + 'a> { /// /// # Examples /// ``` - /// use email_message::{CowMail, Header, HeaderMap}; + /// use cow_mail::{CowMail, Header, HeaderMap}; /// let mut mail = CowMail::try_from(concat!( /// "Subject: Test\n", /// "To: \"John Doe\" \n", @@ -221,7 +221,7 @@ pub trait HeaderMap<'a, H: Header<'a> + 'a> { /// /// # Examples /// ``` - /// use email_message::{CowMail, Header, HeaderMap}; + /// use cow_mail::{CowMail, Header, HeaderMap}; /// let mut mail = CowMail::try_from(concat!( /// "Subject: Test1\n", /// "To: \"John Doe\" \n", @@ -251,7 +251,7 @@ pub trait HeaderMap<'a, H: Header<'a> + 'a> { /// /// # Examples /// ``` - /// use email_message::{CowMail, Header, HeaderMap}; + /// use cow_mail::{CowMail, Header, HeaderMap}; /// let mut mail = CowMail::try_from(concat!( /// "Subject: Test1\n", /// "To: \"John Doe\" \n", @@ -315,7 +315,7 @@ pub(crate) fn build_headers<'a, H: Header<'a>>( /// # Examples /// /// ``` -/// use email_message::{CowHeader, HeaderMap, parse_headers}; +/// use cow_mail::{CowHeader, HeaderMap, parse_headers}; /// /// let raw = b"Subject: Hi\r\nTo: nobody\r\n\r\nbody\r\n"; /// let (headers, body_idx) = parse_headers::(&raw[..]).unwrap(); diff --git a/src/header/mod.rs b/src/header/mod.rs index bb30830..1b97d49 100644 --- a/src/header/mod.rs +++ b/src/header/mod.rs @@ -173,7 +173,7 @@ pub trait Header<'a>: Clone + Display { /// # Examples /// /// ``` - /// use email_message::{CowHeader, Header}; + /// use cow_mail::{CowHeader, Header}; /// /// let header = CowHeader::new("Content-Type", "text/plain; charset=utf-8"); /// assert_eq!(header.get_param("charset").unwrap(), "utf-8"); @@ -262,7 +262,7 @@ impl<'a, T: Header<'a>> From<&'_ T> for RFC2045HeaderValue { /// # Examples /// /// ``` -/// use email_message::{CowHeader, Header}; +/// use cow_mail::{CowHeader, Header}; /// /// let header = CowHeader::new("Subject", "Grüße"); /// @@ -430,7 +430,7 @@ fn build_header<'a, H: Header<'a>>( /// # Examples /// /// ``` -/// use email_message::{CowHeader, Header, parse_header}; +/// use cow_mail::{CowHeader, Header, parse_header}; /// /// let raw = b"Subject: Hi\r\nTo: nobody\r\n"; /// let (header, next) = parse_header::(&raw[..]).unwrap(); diff --git a/src/lib.rs b/src/lib.rs index 9319833..04f882a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -311,7 +311,7 @@ pub trait Mail<'a, T: Header<'a> + 'a>: HeaderMap<'a, T> { /// # Examples /// /// ``` - /// use email_message::{CowMail, Mail}; + /// use cow_mail::{CowMail, Mail}; /// /// let raw = b"Content-Type: text/plain\r\n\ /// Content-Transfer-Encoding: base64\r\n\ @@ -448,7 +448,7 @@ enum BodyCheckStatus { /// All three are empty for a part that was built rather than parsed. /// /// ``` -/// use email_message::{CowMail, HeaderMap, Mail}; +/// use cow_mail::{CowMail, HeaderMap, Mail}; /// /// let raw = b"Subject: Hi\r\n\r\nbody\r\n"; /// let mut mail = CowMail::try_from(&raw[..]).unwrap(); @@ -466,7 +466,7 @@ enum BodyCheckStatus { /// # Examples /// /// ``` -/// use email_message::{CowMail, Header, HeaderMap, Mail}; +/// use cow_mail::{CowMail, Header, HeaderMap, Mail}; /// /// let raw = b"Subject: Hi\r\n\r\nbody\r\n"; /// let mut mail = CowMail::try_from(&raw[..]).unwrap(); @@ -590,7 +590,7 @@ impl<'a, H: Header<'a> + 'a> CowMail<'a, H> { /// # Examples /// /// ``` - /// use email_message::{CowMail, HeaderMap, Mail, MediaType, names}; + /// use cow_mail::{CowMail, HeaderMap, Mail, MediaType, names}; /// /// let mut part = CowMail::default(); /// part.set_content("

hi

", Some(MediaType::new(names::TEXT, names::HTML))); @@ -758,7 +758,7 @@ impl<'a, H: Header<'a> + 'a> CowMail<'a, H> { /// # Examples /// /// ``` - /// use email_message::{BodyType, CowMail, Mail}; + /// use cow_mail::{BodyType, CowMail, Mail}; /// /// let raw = b"Content-Type: multipart/alternative; boundary=\"b\"\r\n\ /// \r\n\ @@ -853,7 +853,7 @@ impl<'a, H: Header<'a> + 'a> CowMail<'a, H> { /// # Examples /// /// ``` - /// use email_message::{CowMail, HeaderMap, Mail}; + /// use cow_mail::{CowMail, HeaderMap, Mail}; /// /// let mut mail = CowMail::default(); /// mail.add_header("Subject", "Hi"); @@ -917,7 +917,7 @@ impl<'a, H: Header<'a> + 'a> CowMail<'a, H> { /// # Examples /// /// ``` - /// use email_message::{CowMail, HeaderMap, Mail, MediaType, names}; + /// use cow_mail::{CowMail, HeaderMap, Mail, MediaType, names}; /// /// let mut mail = CowMail::default(); /// mail.set_text_body("see attached").unwrap(); @@ -1087,7 +1087,7 @@ impl<'a, H: Header<'a> + 'a> CowMail<'a, H> { /// # Examples /// /// ``` - /// use email_message::{BodyType, CowMail, HeaderMap, Mail}; + /// use cow_mail::{BodyType, CowMail, HeaderMap, Mail}; /// /// let mut mail = CowMail::default(); /// mail.add_header("Subject", "Hi"); @@ -1169,7 +1169,7 @@ impl<'a, H: Header<'a> + 'a> CowMail<'a, H> { /// # Examples /// /// ``` - /// use email_message::CowMail; + /// use cow_mail::CowMail; /// /// let raw = b"Subject: Hi\r\n\r\nbody\r\n"; /// let mail = CowMail::try_from(&raw[..]).unwrap(); @@ -1242,7 +1242,7 @@ impl<'a> TryFrom<&'a [u8]> for CowMail<'a, CowHeader<'a>> { /// /// ``` /// use std::io::Read; -/// use email_message::{CowMail, CowMailReader}; +/// use cow_mail::{CowMail, CowMailReader}; /// /// let raw = b"Subject: Hi\r\n\r\nbody\r\n"; /// let mail = CowMail::try_from(&raw[..]).unwrap(); @@ -1343,7 +1343,7 @@ impl std::io::Read for CowMailReader<'_> { /// # Examples /// /// ``` -/// use email_message::{CowHeader, CowMail, HeaderMap, parse_mail}; +/// use cow_mail::{CowHeader, CowMail, HeaderMap, parse_mail}; /// /// let raw = b"Subject: Hi\r\n\r\nbody\r\n"; /// let mail: CowMail = parse_mail(&raw[..]).unwrap();