diff --git a/Cargo.lock b/Cargo.lock
index 2287eaf9..b9e3181a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -585,7 +585,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef"
dependencies = [
"log",
- "regex",
]
[[package]]
@@ -597,7 +596,6 @@ dependencies = [
"anstream",
"anstyle",
"env_filter",
- "jiff",
"log",
]
@@ -827,7 +825,6 @@ dependencies = [
"comfy-table",
"convert_case 0.11.0",
"dirs",
- "gethostname 1.1.0",
"humansize",
"io-discovery",
"io-email",
@@ -1625,7 +1622,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]]
name = "pimalaya-cli"
version = "0.0.1"
-source = "git+https://github.com/pimalaya/cli#9e520d1eb7fdda81e3e44f880130fa9fea741c04"
+source = "git+https://github.com/pimalaya/cli#c3ead3ae2dd74d98e5a695bc476d74399d7a6c0b"
dependencies = [
"anyhow",
"clap",
@@ -1855,18 +1852,6 @@ dependencies = [
"thiserror 2.0.18",
]
-[[package]]
-name = "regex"
-version = "1.12.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-automata 0.4.14",
- "regex-syntax 0.8.10",
-]
-
[[package]]
name = "regex-automata"
version = "0.3.9"
@@ -1875,7 +1860,7 @@ checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9"
dependencies = [
"aho-corasick",
"memchr",
- "regex-syntax 0.7.5",
+ "regex-syntax",
]
[[package]]
@@ -1883,11 +1868,6 @@ name = "regex-automata"
version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax 0.8.10",
-]
[[package]]
name = "regex-syntax"
@@ -1895,12 +1875,6 @@ version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
-[[package]]
-name = "regex-syntax"
-version = "0.8.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
-
[[package]]
name = "rfc2047-decoder"
version = "1.1.0"
diff --git a/Cargo.toml b/Cargo.toml
index 5145656a..0c77017c 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -17,7 +17,7 @@ all-features = true
rustdoc-args = ["--cfg", "docsrs"]
[features]
-default = ["imap", "smtp", "maildir", "jmap", "rustls-ring"]
+default = ["imap", "smtp", "rustls-ring"]
imap = ["dep:io-imap", "dep:mail-parser", "dep:rfc2047-decoder", "io-email/imap", "io-imap/client"]
jmap = ["dep:base64", "dep:io-jmap", "dep:mail-parser", "dep:serde_json", "io-email/jmap", "io-jmap/client"]
smtp = ["dep:io-smtp", "dep:mail-parser", "io-email/smtp"]
@@ -27,6 +27,12 @@ rustls-aws = ["pimalaya-stream/rustls-aws", "io-discovery/rustls-aws", "io-imap?
rustls-ring = ["pimalaya-stream/rustls-ring", "io-discovery/rustls-ring", "io-imap?/rustls-ring", "io-jmap?/rustls-ring", "io-smtp?/rustls-ring"]
vendored = ["pimalaya-stream/vendored"]
+[profile.release]
+lto = "fat"
+codegen-units = 1
+strip = "symbols"
+panic = "abort"
+
[build-dependencies]
pimalaya-cli = { version = "0.0.1", default-features = false, features = ["build"] }
@@ -38,14 +44,13 @@ clap = { version = "4.4", features = ["derive", "env", "wrap_help"] }
comfy-table = "7"
convert_case = { version = "0.11", optional = true }
dirs = "6"
-gethostname = "1"
humansize = "2"
io-discovery = { version = "0.0.1", default-features = false, features = ["pacc", "autoconfig", "rfc6186", "client"] }
ariadne = "0.5"
io-email = { version = "0.0.1", default-features = false, features = ["serde", "client", "search"] }
io-imap = { version = "0.0.1", default-features = false, optional = true }
io-jmap = { version = "0.0.1", default-features = false, optional = true }
-io-maildir = { version = "0.0.1", default-features = false, features = ["serde"], optional = true }
+io-maildir = { version = "0.0.1", default-features = false, optional = true }
io-smtp = { version = "0.0.1", default-features = false, optional = true }
log = "0.4"
mail-builder = "0.3"
diff --git a/README.md b/README.md
index e7095241..63ae4c3e 100644
--- a/README.md
+++ b/README.md
@@ -45,18 +45,18 @@ himalaya envelopes list --account posteo -m Archives.FOSS --page 2
## Features
-- **Shared API** that maps `mailboxes`, `envelopes`, `flags`, `messages` and `attachments` to the active backend (IMAP, JMAP or Maildir)
-- **Protocol-specific APIs** exposing each backend's full surface (`himalaya imap …`, `himalaya jmap …`, `himalaya maildir …`, `himalaya smtp …`)
-- **IMAP** backend [rfc9051](https://www.iana.org/go/rfc9051) (requires `imap` cargo feature)
-- **JMAP** backend [rfc8620](https://www.iana.org/go/rfc8620), [rfc8621](https://www.iana.org/go/rfc8621) (requires `jmap` cargo feature)
-- **Maildir** backend (requires `maildir` cargo feature)
-- **SMTP** backend [rfc5321](https://www.iana.org/go/rfc5321) (requires `smtp` cargo feature)
+- **Shared API** that maps `mailboxes`, `envelopes`, `flags`, `messages` and `attachments` to the active backend
+- **Protocol-specific APIs** exposing each backend's full surface (`himalaya imap/smtp/maildir/jmap…`)
+- **IMAP** support [rfc9051](https://www.iana.org/go/rfc9051) (requires `imap` feature)
+- **JMAP** support [rfc8620](https://www.iana.org/go/rfc8620), [rfc8621](https://www.iana.org/go/rfc8621) (requires `jmap` feature)
+- **Maildir** support (requires `maildir` feature)
+- **SMTP** backend [rfc5321](https://www.iana.org/go/rfc5321) (requires `smtp` feature)
- **TLS** support:
- [native-tls](https://crates.io/crates/native-tls) (requires `native-tls` feature)
- [rustls](https://crates.io/crates/rustls):
- AWS-LC crypto provider (requires `rustls-aws` feature)
- Ring crypto provider (requires `rustls-ring` feature)
-- **SASL** support: ANONYMOUS, LOGIN, PLAIN (IMAP/SMTP)
+- **SASL** support: anonymous, login, plain, oauthbearer, xoauth2, scram-sha-256
- **Provider discovery** wizard powered by [io-discovery](https://github.com/pimalaya/io-discovery): Thunderbird Autoconfiguration, PACC and RFC 6186 SRV lookups
- **TOML** configuration with multi-account support
- **JSON** output via `--json`
@@ -212,7 +212,7 @@ Accounts can be (re)configured later with `himalaya account configure `. T
You can also write the configuration by hand:
-- Copy the documented [`./config.sample.toml`](./config.sample.toml)
+- Copy the documented [./config.sample.toml](./config.sample.toml)
- Paste it into one of:
- `$XDG_CONFIG_HOME/himalaya/config.toml`
- `$HOME/.config/himalaya/config.toml`
@@ -230,7 +230,7 @@ Backend-agnostic commands operate on the account's first configured backend, or
```
himalaya mailboxes list
himalaya envelopes list -m INBOX --page 2
-himalaya envelopes list from alice and after 2026-01-01 order by date desc
+himalaya envelopes search from alice and after 2026-01-01 order by date desc
himalaya flags add -m INBOX --flag seen 1:3,5
himalaya messages copy --from INBOX --to Archives 42
himalaya attachments download -m INBOX 42
@@ -238,13 +238,7 @@ himalaya attachments download -m INBOX 42
When the `inbox` alias is configured under `[mailbox.alias]`, `-m/--mailbox` becomes optional: shared commands fall back to that id. With `[mailbox.alias] inbox = "INBOX"`, the calls above shorten to `envelopes list --page 2`, `flags add --flag seen 1:3,5`, etc.
-`envelopes list` accepts a trailing search query covering `date`, `after`, `from`, `to`, `subject`, `body`, `flag` conditions (combined with `and`, `or`, `not`, grouped with parens) and a `order by date|from|to|subject [asc|desc]` sort chain. Date clauses target the `Date:` header (sent-at) on every backend.
-
-Backend coverage:
-
-- **IMAP**: full grammar via `SEARCH` (RFC 9051) + `SORT` (RFC 5256). `SENTON` / `SENTSINCE` keep date semantics anchored to the `Date:` header.
-- **JMAP**: conjunctive filters only (`or` / `not` rejected; the JMAP wire model does not expose `FilterOperator` in `io-jmap` yet). Date clauses use an over-approximating `receivedAt` server filter plus a client-side `sentAt` post-filter so the sent-at rule is honored exactly.
-- **Maildir**: full grammar except `body` (would require parsing every candidate message file; planned).
+`envelopes list` is plain pagination, ordered by date descending. To filter or sort, use `envelopes search` with a trailing query covering `date`, `after`, `from`, `to`, `subject`, `body`, `flag` conditions (combined with `and`, `or`, `not`, grouped with parens) and an `order by date|from|to|subject [asc|desc]` sort chain. Date clauses target the `Date:` header (sent-at) on every backend.
The shared surface is a strict least-common-denominator subset across IMAP, JMAP and Maildir. Operations that do not generalize (mailbox roles, attribute flags, JMAP-specific queries…) live under the protocol-specific subcommands.