18 Commits
Author SHA1 Message Date
Hieu Nguyen (Jack) 96ce3911af Add account deletion #100 2026-10-15 00:01:06 +07:00
Hieu Nguyen (Jack) 83ade981e5 Add support for AWS S3, BackBlaze B2 as storage 2026-10-09 17:07:33 +07:00
Hieu Nguyen (Jack) 9f66e13560 Added Drive 2026-10-08 21:52:49 +07:00
midego 2b7d78bac7 Auto-delete Trash and Spam after a chosen number of days
Adds Settings > Inbox > Trash and Spam clean-up (closes #68, part 2).

- users.trash_retention_days (null = never) via GET/PATCH /api/settings/trash-retention
- messages.trashed_at, kept current by triggers whichever code path changes status
- Scheduled maintenance purges expired messages in batches of 200 (Workers cron and Node scheduler)
2026-10-05 10:48:51 +07:00
Hieu Nguyen (Jack) 4c5d093d83 Fix #49 2026-09-28 17:21:52 +07:00
Hieu Nguyen (Jack) 73d8ebfe16 Merge pull request #55 from hieunc229/pr-52
Pr 52
2026-09-28 16:23:52 +07:00
Hieu Nguyen (Jack) 1ae2412fcb improve email attachments 2026-09-28 14:54:46 +07:00
Hieu Nguyen (Jack) 7e4c109c7c ran security audit 2026-09-28 14:20:24 +07:00
James 26923a4cb9 Migrate Cloudflare runtime from OpenNext to vinext 2026-09-27 20:29:09 +01:00
Hieu Nguyen (Jack) 20a941bba6 improve jmap 2026-09-28 01:30:10 +07:00
Hieu Nguyen (Jack) da9b803bdb added MCP / Agent 2026-09-27 13:57:31 +07:00
Hieu Nguyen (Jack) a0bbaf3310 replace workflow with cron 2026-09-06 11:12:45 +07:00
Oday BakkourandClaude Opus 5 32d019303c feat(routing): catch-all, forwarding, and reject rules with priorities
Closes the "advanced routing rules" roadmap item. Previously resolveInboundAddress
only ever matched an exact mailbox or alias and hard-coded action "store", so the
forward/reject branches downstream were unreachable and catch-all addresses were
impossible.

Domain rules now resolve in three phases, which is what stops a `*` catch-all
from shadowing real mailboxes:

  1. reject rules, evaluated before any mailbox lookup so a sender can be blocked
     even when the recipient is a real mailbox
  2. exact mailbox, then multi-domain mailbox aliases
  3. remaining forward/store rules as the catch-all fallback

Within each phase rules run by descending priority, then oldest first.

forward and reject are actioned in the Worker `email` handler rather than the
inbound queue consumer, because message.forward() and message.setReject() only
exist on the live ForwardableEmailMessage. A forward drops the message unless the
rule keeps a copy, and a failed forward still stores the message so mail is never
silently lost. Regex patterns are guarded so an invalid pattern cannot throw and
take down inbound processing.

The existing mailbox-scope rules are unchanged in behaviour; both queries now
filter on scope so the two kinds never leak into each other's UI.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PGeWDVSkXtVEmDAN2AtB9h
2026-08-30 10:18:12 +03:00
Hieu Nguyen (Jack) 9eca43d388 Added shared inbox + forward email 2026-08-28 19:04:19 +07:00
Hieu Nguyen (Jack) dc973c6c39 push v0.1.12 2026-06-18 23:24:27 +07:00
Hieu Nguyen (Jack) 301cf0e970 Update variable names 2026-05-26 08:58:47 +07:00
Hieu Nguyen (Jack) cf9d2a8919 minor updates 2026-05-26 08:26:17 +07:00
Hieu Nguyen (Jack) d6771603ef push to git 2026-05-26 08:19:09 +07:00