server: handle multipart/related with a multipart/alternative embedded

This commit is contained in:
Bill Thiede 2024-05-05 19:03:38 -07:00
parent 96d3e4a7d6
commit 55d7aec516

View File

@ -514,6 +514,7 @@ fn extract_body(m: &ParsedMail, id: &str) -> Result<Body, Error> {
TEXT_HTML => return Ok(Body::html(body)), TEXT_HTML => return Ok(Body::html(body)),
MULTIPART_MIXED => extract_mixed(m, &mut part_addr), MULTIPART_MIXED => extract_mixed(m, &mut part_addr),
MULTIPART_ALTERNATIVE => extract_alternative(m, &mut part_addr), MULTIPART_ALTERNATIVE => extract_alternative(m, &mut part_addr),
MULTIPART_RELATED => extract_related(m, &mut part_addr),
_ => extract_unhandled(m), _ => extract_unhandled(m),
}; };
if let Err(err) = ret { if let Err(err) = ret {
@ -668,9 +669,9 @@ fn flatten_body_parts(parts: &[Body]) -> Body {
Body::html(html) Body::html(html)
} }
fn extract_related(m: &ParsedMail, _part_addr: &mut Vec<String>) -> Result<Body, Error> { fn extract_related(m: &ParsedMail, part_addr: &mut Vec<String>) -> Result<Body, Error> {
// TODO(wathiede): collect related things and change return type to new Body arm. // TODO(wathiede): collect related things and change return type to new Body arm.
let handled_types = vec![TEXT_HTML, TEXT_PLAIN]; let handled_types = vec![MULTIPART_ALTERNATIVE, TEXT_HTML, TEXT_PLAIN];
let mut unhandled_types: Vec<_> = m let mut unhandled_types: Vec<_> = m
.subparts .subparts
.iter() .iter()
@ -680,6 +681,11 @@ fn extract_related(m: &ParsedMail, _part_addr: &mut Vec<String>) -> Result<Body,
unhandled_types.sort(); unhandled_types.sort();
warn!("{MULTIPART_RELATED} contains the following unhandled mimetypes {unhandled_types:?}"); warn!("{MULTIPART_RELATED} contains the following unhandled mimetypes {unhandled_types:?}");
for sp in &m.subparts {
if sp.ctype.mimetype == MULTIPART_ALTERNATIVE {
return extract_alternative(m, part_addr);
}
}
for sp in &m.subparts { for sp in &m.subparts {
if sp.ctype.mimetype == TEXT_HTML { if sp.ctype.mimetype == TEXT_HTML {
let body = sp.get_body()?; let body = sp.get_body()?;