diff --git a/melib/src/email/attachment_types.rs b/melib/src/email/attachment_types.rs index 9a34e2c1..81276112 100644 --- a/melib/src/email/attachment_types.rs +++ b/melib/src/email/attachment_types.rs @@ -140,6 +140,7 @@ impl From<&[u8]> for MultipartType { pub enum ContentType { Text { kind: Text, + parameters: Vec<(Vec, Vec)>, charset: Charset, }, Multipart { @@ -162,6 +163,7 @@ impl Default for ContentType { fn default() -> Self { ContentType::Text { kind: Text::Plain, + parameters: Vec::new(), charset: Charset::UTF8, } } diff --git a/melib/src/email/attachments.rs b/melib/src/email/attachments.rs index fa1fea2e..8879bd67 100644 --- a/melib/src/email/attachments.rs +++ b/melib/src/email/attachments.rs @@ -131,10 +131,7 @@ impl AttachmentBuilder { parts, }; } else if ct.eq_ignore_ascii_case(b"text") { - self.content_type = ContentType::Text { - kind: Text::Plain, - charset: Charset::UTF8, - }; + self.content_type = ContentType::default(); for (n, v) in params { if n.eq_ignore_ascii_case(b"charset") { if let ContentType::Text { @@ -143,7 +140,13 @@ impl AttachmentBuilder { { *c = Charset::from(v); } - break; + } + if let ContentType::Text { + parameters: ref mut p, + .. + } = self.content_type + { + p.push((n.to_vec(), v.to_vec())); } } if cst.eq_ignore_ascii_case(b"html") { @@ -587,11 +590,28 @@ impl Attachment { .chars(), ); match &a.content_type { - ContentType::Text { kind: _, charset } => { + ContentType::Text { + kind: _, + parameters, + charset, + } => { ret.extend( - format!("Content-Type: {}; charset={}\n\n", a.content_type, charset) - .chars(), + format!("Content-Type: {}; charset={}", a.content_type, charset).chars(), ); + for (n, v) in parameters { + ret.push_str("; "); + ret.extend(String::from_utf8_lossy(n).chars()); + ret.push_str("="); + if v.contains(&b' ') { + ret.push_str("\""); + } + ret.extend(String::from_utf8_lossy(v).chars()); + if v.contains(&b' ') { + ret.push_str("\""); + } + } + + ret.push_str("\n\n"); ret.extend(String::from_utf8_lossy(a.body()).chars()); } ContentType::Multipart { diff --git a/melib/src/email/compose.rs b/melib/src/email/compose.rs index 08d970e1..abb39e84 100644 --- a/melib/src/email/compose.rs +++ b/melib/src/email/compose.rs @@ -329,18 +329,14 @@ fn build_multipart(ret: &mut String, kind: MultipartType, parts: Vec { + parameters: ref v, + } if v.is_empty() => { ret.push('\n'); ret.push_str(&String::from_utf8_lossy(sub.raw())); ret.push('\n'); } - Text { - ref kind, - charset: _, - } => { - ret.extend(format!("Content-Type: {}; charset=\"utf-8\"\n", kind).chars()); - ret.push('\n'); - ret.push_str(&String::from_utf8_lossy(sub.raw())); + Text { .. } => { + ret.extend(sub.build().into_raw().chars()); ret.push('\n'); } Multipart {