132 Commits

Author SHA1 Message Date
rustmailer
02b8741725 fix(imap): downgrade empty tail-fetch from error to info #342 2026-08-19 17:31:47 +08:00
rustmailer
d9097f85cf refactor: rename cache module to archive 2026-08-19 17:02:55 +08:00
sripwoud
fa98f161c6 fix(core): carry duplicates through the import audit event
success no longer includes dedup-skipped mail, so without a
duplicates field ImportPerformed consumers could not tell an
all-duplicates batch from one that silently lost everything. Also
documents that ExtractOutcome::Imported covers mail dropped by
archive rules, which has always counted as a success.
2026-08-19 08:45:21 +02:00
sripwoud
8eac80e15c style(core): format files touched by the dedup fix
rustfmt +nightly (imports_granularity, group_imports per
.rustfmt.toml) over the five files the fix touched, plus trailing
whitespace cleanup. No behavior change.
2026-08-19 08:45:21 +02:00
sripwoud
0899aafbb3 fix(core): count deduplicated imports as duplicates, not successes
A BLAKE3 content-hash hit in extract_envelope_core returned the same
Ok(()) as a real import, so every import surface counted silently
skipped messages as successes and the documented duplicates field
stayed 0 forever.

Make the outcome explicit: extract_envelope_core now returns
ExtractOutcome::{Imported, Duplicate} and every import loop (batch
/import, upload EML, MBOX, PST) counts Duplicate into duplicates
instead of success. total = success + duplicates + failed holds on
every path; duplicates produce no failed_details entries and an
all-duplicates run reports Completed. The batch endpoint status check
treats duplicates as processed work so a duplicates-plus-failures run
keeps reporting Completed as before. The SMTP receiver and IMAP sync
ignore the outcome.
2026-08-19 08:45:21 +02:00
rustmailer
2d61f5b555 fix: Dangerous text in migration to 2.x #349 2026-08-19 13:24:12 +08:00
rustmailer
eb2e4b5393 fix(imap): stop silent mail loss from truncated UID SEARCH enumeration 2026-08-07 19:20:42 +08:00
rustmailer
adb94263c0 feat(audit): audit log page, full event coverage, retention cleanup, and duplicate-view dedup 2026-08-07 00:50:13 +08:00
rustmailer
ed02c642c8 feat(imap): gap-fill missing-mail repair with live progress UI 2026-08-06 01:18:20 +08:00
rustmailer
75d345b742 feat(imap): resilient batched sync, stale-session cleanup, and live progress UI
- Add SyncFull trigger and configurable IMAP socket read timeout
  - Replace streaming UID FETCH with UID SEARCH ALL + batched fetch so per-message progress stays responsive and throttling servers can retry with reconnection
  - Finalize stale Running sessions on startup so interrupted syncs no longer show a phantom "syncing" state
  - Show a live syncing pill on the account row; add elapsed time, current folder, and slow-server warning styling in the dialog
2026-08-04 17:47:42 +08:00
rustmailer
7c7a490091 Merge pull request #325 from hammaschlach/feature/imap-poll-interval
Allow IMAP sync intervals as low as 1 minute
2026-07-29 17:07:49 +08:00
rustmailer
a280fb6198 feat(server): auto-build web frontend in build.rs 2026-07-29 00:24:06 +08:00
rustmailer
02e9864343 Merge remote-tracking branch 'origin/main' into replace-fjall-with-blob 2026-07-28 21:38:44 +08:00
rustmailer
eae26d3e97 perf(blob): batch blob writes during migration to avoid per-blob fsync overhead 2026-07-28 21:13:16 +08:00
rustmailer
664ac2fe55 fix: can't set proxy for email account (IMAP) #326 2026-07-20 23:00:36 +08:00
rustmailer
c468f8be41 fix(admin): skip oversized blobs during migration instead of aborting 2026-07-16 05:22:10 +08:00
misolau
b4972d81f0 Allow IMAP sync intervals as low as 1 minute 2026-07-15 08:35:22 +00:00
rustmailer
a88b5c84f3 Merge remote-tracking branch 'origin/main' into replace-fjall-with-blob 2026-07-15 10:48:51 +08:00
rustmailer
c6da79cdb0 feat(config): add built-in IMAP server config with shared SMTP/IMAP TLS paths 2026-07-15 09:40:44 +08:00
rustmailer
eac19ce695 Update envelope.rs 2026-07-14 07:34:56 +08:00
rustmailer
951901ac0b update 2026-07-14 05:49:54 +08:00
rustmailer
b7e757dbf7 update 2026-07-13 20:56:26 +08:00
rustmailer
85987e39fb update 2026-07-13 00:04:53 +08:00
rustmailer
adff34940c update 2026-07-10 17:24:56 +08:00
rustmailer
a8f2740973 Create README.md 2026-07-10 16:44:25 +08:00
rustmailer
36692e2091 feat: replace fjall with bichon-blob for blob storage
- use a single Engine instance for email + attachment blobs
  - add delete_batch, gc_if_needed, background flush to blob crate
  - fix Entry.raw_size storing compressed length instead of original
  - move fjall-dependent migration code from core to admin crate
  - add STORAGE_VERSION file for layout version detection
2026-07-10 03:17:38 +08:00
rustmailer
4cdf3ee5f1 refactor(blob): add delete_batch, gc_if_needed, background flush, and fix bincode compat
- Replace bincode 3.0.0 (empty crate) with bincode_reloaded 3.1.10
  - Add delete_batch for efficient grouped tombstone writes
  - Add gc_if_needed to skip GC when no segment exceeds threshold
  - Add flush() for lightweight fsync+meta checkpoint without compact
  - Add Config::flush_interval_secs to spawn a background flush thread
  - Remove per-put/per-delete fsync; persistence via background flush
  - Split gc_segments into gc_prepare/gc_finish to reduce write lock hold time
2026-07-10 01:52:04 +08:00
rustmailer
7dee5a7874 bump to v1.6.2 2026-07-08 23:55:05 +08:00
rustmailer
524201c26d docs(openapi): update attachment download param to content_hash #314 2026-07-06 09:46:29 +08:00
8times4
24fcca70a5 expand proxy provider support 2026-06-30 14:59:08 +02:00
rustmailer
2da42134d0 feat: Improve account setup UI and add post-download email filtering 2026-06-30 09:42:03 +08:00
rustmailer
40ae2d49d4 feat: web upload supports PST, configurable MBOX/PST size limits
- Make MBOX/PST upload size limits configurable via SETTINGS
    (bichon_web_mbox_upload_limit_mb defaults to 1 GB,
     bichon_web_pst_upload_limit_mb defaults to 2 GB)
2026-06-28 09:43:50 +08:00
rustmailer
cfb8172607 fix: sliding token expiry and silent 401 redirect 2026-06-26 18:29:18 +08:00
rustmailer
8641bb4b56 fix: Proxy does not support formats from proxy providers #307 2026-06-26 18:20:19 +08:00
rustmailer
cdf27f2dd4 feat: add web upload for EML/MBOX files #260 2026-06-26 17:49:35 +08:00
rustmailer
db36272bae feat: add in-browser attachment preview for images, PDFs, and text files #303 2026-06-25 04:51:05 +08:00
rustmailer
cad447275f feat: search for an email address simultaneously in to, cc and bcc #304 2026-06-25 02:36:24 +08:00
rustmailer
8542ba0d28 feat: Display Name / Alias for IMAP Accounts #306 2026-06-25 02:00:20 +08:00
rustmailer
bba1ea5cc7 feat: add per-account FilterRule, ExtractionRules and ArchiveRules with regex validation 2026-06-24 21:46:32 +08:00
rustmailer
9e55026f12 feat: add SSO/OIDC support to user model and settings 2026-06-24 17:32:14 +08:00
rustmailer
b0f229618c refactor(blob): add NFS-safe file I/O layer 2026-06-24 00:03:56 +08:00
rustmailer
ff59d47a0d fix(blob): fsync meta before rename and hold write_mutex during GC 2026-06-23 23:57:34 +08:00
rustmailer
b6957c8ceb test(blob): add concurrent access and crash recovery integration tests 2026-06-23 23:29:48 +08:00
rustmailer
cd98c050b6 fix(blob): invalidate FilePool after GC to prevent stale reads 2026-06-23 23:28:33 +08:00
rustmailer
11e40750fe feat(blob): add FilePool read cache and fix BucketCache TOCTOU 2026-06-23 23:23:03 +08:00
rustmailer
b0374517e8 fix(blob): address review issues - visibility, unused param 2026-06-23 23:20:24 +08:00
rustmailer
4e12ae5457 refactor(blob): replace global RwLock with per-account Arc<AccountHandle> 2026-06-23 23:13:39 +08:00
rustmailer
495c91b7ae fix(blob): address code review issues - CRC guard, tests, clone 2026-06-23 23:10:15 +08:00
rustmailer
e442db4a2d feat(blob): replace JSON metadata with bincode + CRC32 binary format 2026-06-23 23:01:32 +08:00
rustmailer
cc54063669 chore(blob): add bincode dependency and new meta error variants 2026-06-23 22:55:13 +08:00