From f4603f8aafb2e703543d49d41b2e5c00f448c7b4 Mon Sep 17 00:00:00 2001 From: mdecimus <11444311+mdecimus@users.noreply.github.com> Date: Sat, 10 Jan 2026 09:34:18 -0300 Subject: [PATCH] IMAP: Map header searches to indexed fields --- crates/imap/src/op/search.rs | 67 +++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/crates/imap/src/op/search.rs b/crates/imap/src/op/search.rs index 81ab35ba..3d4cf783 100644 --- a/crates/imap/src/op/search.rs +++ b/crates/imap/src/op/search.rs @@ -468,27 +468,54 @@ impl SessionData { } Filter::Header(header, value) => { if let Some(header) = HeaderName::parse(header) { - let op = if matches!( - header, - HeaderName::MessageId - | HeaderName::InReplyTo - | HeaderName::References - | HeaderName::ResentMessageId - ) || value.is_empty() - { - SearchOperator::Equal - } else { - SearchOperator::Contains - }; + match header { + HeaderName::Subject => { + filters.push(SearchFilter::has_text_detect( + EmailSearchField::Subject, + value, + self.server.core.jmap.default_language, + )); + } + header @ (HeaderName::From + | HeaderName::To + | HeaderName::Cc + | HeaderName::Bcc) => { + filters.push(SearchFilter::has_text( + match header { + HeaderName::From => EmailSearchField::From, + HeaderName::To => EmailSearchField::To, + HeaderName::Cc => EmailSearchField::Cc, + HeaderName::Bcc => EmailSearchField::Bcc, + _ => unreachable!(), + }, + value, + Language::None, + )); + } + header => { + let op = if matches!( + header, + HeaderName::MessageId + | HeaderName::InReplyTo + | HeaderName::References + | HeaderName::ResentMessageId + ) || value.is_empty() + { + SearchOperator::Equal + } else { + SearchOperator::Contains + }; - filters.push(SearchFilter::cond( - EmailSearchField::Headers, - op, - SearchValue::KeyValues( - VecMap::with_capacity(1) - .with_append(header.as_str().to_lowercase(), value), - ), - )); + filters.push(SearchFilter::cond( + EmailSearchField::Headers, + op, + SearchValue::KeyValues( + VecMap::with_capacity(1) + .with_append(header.as_str().to_lowercase(), value), + ), + )); + } + } } } Filter::Subject(text) => {