notmuch & server: plumb Delivered-To and X-Original-To headers

This commit is contained in:
Bill Thiede 2025-02-23 09:37:09 -08:00
parent bc4b15a5aa
commit e6b3a5b5a9
4 changed files with 38 additions and 1 deletions

View File

@ -271,6 +271,12 @@ pub struct Headers {
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub bcc: Option<String>, pub bcc: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
#[serde(alias = "Delivered-To")]
pub delivered_to: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(alias = "X-Original-To")]
pub x_original_to: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reply_to: Option<String>, pub reply_to: Option<String>,
pub date: String, pub date: String,
} }
@ -635,10 +641,21 @@ impl Notmuch {
let Some(msg) = &tn.0 else { let Some(msg) = &tn.0 else {
return Ok(()); return Ok(());
}; };
info!("msg.headers {:#?}", msg.headers);
let mut addrs = vec![]; let mut addrs = vec![];
let hdr = &msg.headers.to; let hdr = &msg.headers.to;
if let Some(to) = hdr { if let Some(to) = hdr {
addrs.push(to); addrs.push(to);
} else {
let hdr = &msg.headers.x_original_to;
if let Some(to) = hdr {
addrs.push(to);
} else {
let hdr = &msg.headers.delivered_to;
if let Some(to) = hdr {
addrs.push(to);
};
};
}; };
let hdr = &msg.headers.cc; let hdr = &msg.headers.cc;
if let Some(cc) = hdr { if let Some(cc) = hdr {

View File

@ -95,6 +95,10 @@ pub struct Message {
pub to: Vec<Email>, pub to: Vec<Email>,
// All CC headers found in email // All CC headers found in email
pub cc: Vec<Email>, pub cc: Vec<Email>,
// X-Original-To header found in email
pub x_original_to: Option<Email>,
// Delivered-To header found in email
pub delivered_to: Option<Email>,
// First Subject header found in email // First Subject header found in email
pub subject: Option<String>, pub subject: Option<String>,
// Parsed Date header, if found and valid // Parsed Date header, if found and valid

View File

@ -773,7 +773,19 @@ impl Query {
for uid in &self.uids { for uid in &self.uids {
parts.push(uid.clone()); parts.push(uid.clone());
} }
parts.extend(self.remainder.clone()); for r in &self.remainder {
// Rewrite "to:" to include ExtraTo:. ExtraTo: is configured in
// notmuch-config to index Delivered-To and X-Original-To headers.
if r.starts_with("to:") {
parts.push("(".to_string());
parts.push(r.to_string());
parts.push("OR".to_string());
parts.push(r.replace("to:", "ExtraTo:"));
parts.push(")".to_string());
} else {
parts.push(r.to_string());
}
}
parts.join(" ") parts.join(" ")
} }
} }

View File

@ -196,6 +196,8 @@ pub async fn thread(
let to = email_addresses(&path, &m, "to")?; let to = email_addresses(&path, &m, "to")?;
let cc = email_addresses(&path, &m, "cc")?; let cc = email_addresses(&path, &m, "cc")?;
let delivered_to = email_addresses(&path, &m, "delivered-to")?.pop();
let x_original_to = email_addresses(&path, &m, "x-original-to")?.pop();
let subject = m.headers.get_first_value("subject"); let subject = m.headers.get_first_value("subject");
let timestamp = m let timestamp = m
.headers .headers
@ -315,6 +317,8 @@ pub async fn thread(
body, body,
path, path,
attachments, attachments,
delivered_to,
x_original_to,
}); });
} }
messages.reverse(); messages.reverse();