Compare commits
3 Commits
chumsky-to
...
semver-com
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb33215a00 | ||
|
|
3d16344d53 | ||
|
|
8873153178 |
14
CHANGELOG.md
14
CHANGELOG.md
@@ -1,3 +1,17 @@
|
|||||||
|
<a name="v0.11.18"></a>
|
||||||
|
### v0.11.18 (2025-07-28)
|
||||||
|
|
||||||
|
#### Features
|
||||||
|
|
||||||
|
* Allow inline attachments to be named ([#1101])
|
||||||
|
|
||||||
|
#### Misc
|
||||||
|
|
||||||
|
* Upgrade `socket2` to v0.6 ([#1098])
|
||||||
|
|
||||||
|
[#1098]: https://github.com/lettre/lettre/pull/1098
|
||||||
|
[#1101]: https://github.com/lettre/lettre/pull/1101
|
||||||
|
|
||||||
<a name="v0.11.17"></a>
|
<a name="v0.11.17"></a>
|
||||||
### v0.11.17 (2025-06-06)
|
### v0.11.17 (2025-06-06)
|
||||||
|
|
||||||
|
|||||||
573
Cargo.lock
generated
573
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -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.17"
|
version = "0.11.18"
|
||||||
description = "Email client"
|
description = "Email client"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
homepage = "https://lettre.rs"
|
homepage = "https://lettre.rs"
|
||||||
|
|||||||
@@ -28,8 +28,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<a href="https://deps.rs/crate/lettre/0.11.17">
|
<a href="https://deps.rs/crate/lettre/0.11.18">
|
||||||
<img src="https://deps.rs/crate/lettre/0.11.17/status.svg"
|
<img src="https://deps.rs/crate/lettre/0.11.18/status.svg"
|
||||||
alt="dependency status" />
|
alt="dependency status" />
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -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.17")]
|
#![doc(html_root_url = "https://docs.rs/crate/lettre/0.11.18")]
|
||||||
#![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)]
|
||||||
|
|||||||
@@ -16,7 +16,10 @@ enum Disposition {
|
|||||||
/// File name
|
/// File name
|
||||||
Attached(String),
|
Attached(String),
|
||||||
/// Content id
|
/// Content id
|
||||||
Inline(String),
|
Inline {
|
||||||
|
content_id: String,
|
||||||
|
name: Option<String>,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Attachment {
|
impl Attachment {
|
||||||
@@ -81,7 +84,50 @@ impl Attachment {
|
|||||||
/// ```
|
/// ```
|
||||||
pub fn new_inline(content_id: String) -> Self {
|
pub fn new_inline(content_id: String) -> Self {
|
||||||
Attachment {
|
Attachment {
|
||||||
disposition: Disposition::Inline(content_id),
|
disposition: Disposition::Inline {
|
||||||
|
content_id,
|
||||||
|
name: None,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Create a new inline attachment giving it a name
|
||||||
|
///
|
||||||
|
/// This attachment should be displayed inline into the message
|
||||||
|
/// body:
|
||||||
|
///
|
||||||
|
/// ```html
|
||||||
|
/// <img src="cid:123">
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
///
|
||||||
|
/// ```rust
|
||||||
|
/// # use std::error::Error;
|
||||||
|
/// use std::fs;
|
||||||
|
///
|
||||||
|
/// use lettre::message::{header::ContentType, Attachment};
|
||||||
|
///
|
||||||
|
/// # fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
/// let content_id = String::from("123");
|
||||||
|
/// let file_name = String::from("image.jpg");
|
||||||
|
/// # if false {
|
||||||
|
/// let filebody = fs::read(&file_name)?;
|
||||||
|
/// # }
|
||||||
|
/// # let filebody = fs::read("docs/lettre.png")?;
|
||||||
|
/// let content_type = ContentType::parse("image/jpeg").unwrap();
|
||||||
|
/// let attachment =
|
||||||
|
/// Attachment::new_inline_with_name(content_id, file_name).body(filebody, content_type);
|
||||||
|
///
|
||||||
|
/// // The image `attachment` will display inline into the email.
|
||||||
|
/// # Ok(())
|
||||||
|
/// # }
|
||||||
|
/// ```
|
||||||
|
pub fn new_inline_with_name(content_id: String, name: String) -> Self {
|
||||||
|
Attachment {
|
||||||
|
disposition: Disposition::Inline {
|
||||||
|
content_id,
|
||||||
|
name: Some(name),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,9 +141,18 @@ impl Attachment {
|
|||||||
Disposition::Attached(filename) => {
|
Disposition::Attached(filename) => {
|
||||||
builder.header(header::ContentDisposition::attachment(&filename))
|
builder.header(header::ContentDisposition::attachment(&filename))
|
||||||
}
|
}
|
||||||
Disposition::Inline(content_id) => builder
|
Disposition::Inline {
|
||||||
|
content_id,
|
||||||
|
name: None,
|
||||||
|
} => builder
|
||||||
.header(header::ContentId::from(format!("<{content_id}>")))
|
.header(header::ContentId::from(format!("<{content_id}>")))
|
||||||
.header(header::ContentDisposition::inline()),
|
.header(header::ContentDisposition::inline()),
|
||||||
|
Disposition::Inline {
|
||||||
|
content_id,
|
||||||
|
name: Some(name),
|
||||||
|
} => builder
|
||||||
|
.header(header::ContentId::from(format!("<{content_id}>")))
|
||||||
|
.header(header::ContentDisposition::inline_with_name(&name)),
|
||||||
};
|
};
|
||||||
builder = builder.header(content_type);
|
builder = builder.header(content_type);
|
||||||
builder.body(content)
|
builder.body(content)
|
||||||
@@ -142,4 +197,24 @@ mod tests {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn attachment_inline_with_name() {
|
||||||
|
let id = String::from("id");
|
||||||
|
let name = String::from("test");
|
||||||
|
let part = super::Attachment::new_inline_with_name(id, name).body(
|
||||||
|
String::from("Hello world!"),
|
||||||
|
ContentType::parse("text/plain").unwrap(),
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
&String::from_utf8_lossy(&part.formatted()),
|
||||||
|
concat!(
|
||||||
|
"Content-ID: <id>\r\n",
|
||||||
|
"Content-Disposition: inline; filename=\"test\"\r\n",
|
||||||
|
"Content-Type: text/plain\r\n",
|
||||||
|
"Content-Transfer-Encoding: 7bit\r\n\r\n",
|
||||||
|
"Hello world!\r\n"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user