Compare commits

...

6 Commits

Author SHA1 Message Date
Paolo Barbolini
12dccd2bbe Prepare v0.11.19 (#1115) 2025-10-08 19:23:57 +02:00
Leo-Tinkeam
7899da9672 docs: fix readme example (#1114)
Signed-off-by: Léo-Tinkeam <sarcyleo@gmail.com>
2025-10-01 22:07:44 +02:00
Paolo Barbolini
a85fdefe6f build(deps): upgrade semver compatible dependencies (#1113) 2025-10-01 15:24:41 +02:00
Paolo Barbolini
b73611c67f refactor: replace static_assert! with std assert! (#1112) 2025-10-01 14:45:08 +02:00
Norbiros
55cea7dbe6 feat: add method to set raw custom headers in MessageBuilder (#1108)
Closes #661
2025-10-01 14:32:57 +02:00
Paolo Barbolini
d2b9d50000 build(deps): upgrade semver compatible dependencies (#1103) 2025-08-10 17:16:37 +00:00
7 changed files with 406 additions and 440 deletions

View File

@@ -1,3 +1,19 @@
<a name="v0.11.19"></a>
### v0.11.19 (2025-10-08)
#### Features
* Add raw header setter to `MessageBuilder` ([#1108])
#### Misc
* Fix README example ([#1114])
* Replace custom `static_assert!` macro with `std::assert!` ([#1112])
[#1108]: https://github.com/lettre/lettre/pull/1108
[#1112]: https://github.com/lettre/lettre/pull/1112
[#1114]: https://github.com/lettre/lettre/pull/1114
<a name="v0.11.18"></a> <a name="v0.11.18"></a>
### v0.11.18 (2025-07-28) ### v0.11.18 (2025-07-28)

785
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
[package] [package]
name = "lettre" name = "lettre"
# remember to update html_root_url and README.md (Cargo.toml example and deps.rs badge) # remember to update html_root_url and README.md (Cargo.toml example and deps.rs badge)
version = "0.11.18" version = "0.11.19"
description = "Email client" description = "Email client"
readme = "README.md" readme = "README.md"
homepage = "https://lettre.rs" homepage = "https://lettre.rs"

View File

@@ -28,8 +28,8 @@
</div> </div>
<div align="center"> <div align="center">
<a href="https://deps.rs/crate/lettre/0.11.18"> <a href="https://deps.rs/crate/lettre/0.11.19">
<img src="https://deps.rs/crate/lettre/0.11.18/status.svg" <img src="https://deps.rs/crate/lettre/0.11.19/status.svg"
alt="dependency status" /> alt="dependency status" />
</a> </a>
</div> </div>
@@ -67,15 +67,15 @@ lettre = "0.11"
``` ```
```rust,no_run ```rust,no_run
use lettre::message::header::ContentType; use lettre::message::{Mailbox, header::ContentType};
use lettre::transport::smtp::authentication::Credentials; use lettre::transport::smtp::authentication::Credentials;
use lettre::{Message, SmtpTransport, Transport}; use lettre::{Message, SmtpTransport, Transport};
fn main() { fn main() {
let email = Message::builder() let email = Message::builder()
.from(Mailbox::new("NoBody".to_owned(), "nobody@domain.tld".parse().unwrap())) .from(Mailbox::new(Some("NoBody".to_owned()), "nobody@domain.tld".parse().unwrap()))
.reply_to(Mailbox::new("Yuin".to_owned(), "yuin@domain.tld".parse().unwrap())) .reply_to(Mailbox::new(Some("Yuin".to_owned()), "yuin@domain.tld".parse().unwrap()))
.to(Mailbox::new("Hei".to_owned(), "hei@domain.tld".parse().unwrap())) .to(Mailbox::new(Some("Hei".to_owned()), "hei@domain.tld".parse().unwrap()))
.subject("Happy new year") .subject("Happy new year")
.header(ContentType::TEXT_PLAIN) .header(ContentType::TEXT_PLAIN)
.body(String::from("Be happy!")) .body(String::from("Be happy!"))

View File

@@ -162,7 +162,7 @@
//! [mime 0.3]: https://docs.rs/mime/0.3 //! [mime 0.3]: https://docs.rs/mime/0.3
//! [DKIM]: https://datatracker.ietf.org/doc/html/rfc6376 //! [DKIM]: https://datatracker.ietf.org/doc/html/rfc6376
#![doc(html_root_url = "https://docs.rs/crate/lettre/0.11.18")] #![doc(html_root_url = "https://docs.rs/crate/lettre/0.11.19")]
#![doc(html_favicon_url = "https://lettre.rs/favicon.ico")] #![doc(html_favicon_url = "https://lettre.rs/favicon.ico")]
#![doc(html_logo_url = "https://avatars0.githubusercontent.com/u/15113230?v=4")] #![doc(html_logo_url = "https://avatars0.githubusercontent.com/u/15113230?v=4")]
#![forbid(unsafe_code)] #![forbid(unsafe_code)]

View File

@@ -186,21 +186,15 @@ impl HeaderName {
/// Creates a new header name, panics on invalid name /// Creates a new header name, panics on invalid name
pub const fn new_from_ascii_str(ascii: &'static str) -> Self { pub const fn new_from_ascii_str(ascii: &'static str) -> Self {
macro_rules! static_assert { assert!(!ascii.is_empty());
($condition:expr) => { assert!(ascii.len() <= 76);
let _ = [()][(!($condition)) as usize]; assert!(ascii.is_ascii());
};
}
static_assert!(!ascii.is_empty());
static_assert!(ascii.len() <= 76);
let bytes = ascii.as_bytes(); let bytes = ascii.as_bytes();
let mut i = 0; let mut i = 0;
while i < bytes.len() { while i < bytes.len() {
static_assert!(bytes[i].is_ascii()); assert!(bytes[i] != b' ');
static_assert!(bytes[i] != b' '); assert!(bytes[i] != b':');
static_assert!(bytes[i] != b':');
i += 1; i += 1;
} }

View File

@@ -217,7 +217,7 @@ mod mimebody;
use crate::{ use crate::{
address::Envelope, address::Envelope,
message::header::{ContentTransferEncoding, Header, Headers, MailboxesHeader}, message::header::{ContentTransferEncoding, Header, HeaderValue, Headers, MailboxesHeader},
Error as EmailError, Error as EmailError,
}; };
@@ -369,6 +369,12 @@ impl MessageBuilder {
self self
} }
/// Set raw custom header to message
pub fn raw_header(mut self, raw_header: HeaderValue) -> Self {
self.headers.insert_raw(raw_header);
self
}
/// Add mailbox to header /// Add mailbox to header
pub fn mailbox<H: Header + MailboxesHeader>(self, header: H) -> Self { pub fn mailbox<H: Header + MailboxesHeader>(self, header: H) -> Self {
match self.headers.get::<H>() { match self.headers.get::<H>() {
@@ -711,7 +717,10 @@ mod test {
.header(header::To( .header(header::To(
vec!["Pony O.P. <pony@domain.tld>".parse().unwrap()].into(), vec!["Pony O.P. <pony@domain.tld>".parse().unwrap()].into(),
)) ))
.header(header::Subject::from(String::from("яңа ел белән!"))) .raw_header(header::HeaderValue::new(
header::HeaderName::new_from_ascii_str("Subject"),
"яңа ел белән!".to_owned(),
))
.body(String::from("Happy new year!")) .body(String::from("Happy new year!"))
.unwrap(); .unwrap();