What's Changed
- feat: Mail UI by @pateljannat in #5
- feat: Threading by @pateljannat in #6
- refactor: clean up by @pateljannat in #7
- fix: csrf token issue by @pateljannat in #8
- feat: Threading in List View by @pateljannat in #9
- chore: build and .gitignore fixed by @pateljannat in #10
- fix: gemoji import by @pateljannat in #11
- fix: handles re-transfer correctly by @s-aga-r in #14
- chore: app installation docs by @s-aga-r in #15
- refactor: move
Mail AgenttoMail Settingsby @s-aga-r in #16 - refactor: rename DocType
DNS RecordtoMail Domain DNS Recordby @s-aga-r in #17 - feat: add DNS records to DO by @s-aga-r in #18
- refactor!: convert
Mail Agentto a non-child DocType by @s-aga-r in #19 - feat: Spam Detection by @s-aga-r in #20
- feat: report
Outgoing Mail Summaryby @s-aga-r in #22 - refactor!: split into frappe/mail and frappe/mail_server by @s-aga-r in #25
- docs: Frappe Mail Client by @s-aga-r in #26
- ci: migrate from
blacktoruffby @s-aga-r in #27 - refactor!: rename app to
mail_clientby @s-aga-r in #28 - chore: sign outgoing-mail with from domain by @s-aga-r in #29
- refactor: pass message as file to outbound API by @s-aga-r in #30
- refactor: generate DKIM keys by @s-aga-r in #31
- feat: rotate DKIM keys and access token by @s-aga-r in #32
- refactor: Outbound API by @s-aga-r in #33
- chore: change mail ui route to /mail by @s-aga-r in #36
- feat: select mailbox while sending mail by @krantheman in #37
- fix: add
Receivedheader while generating OM by @s-aga-r in #39 - feat: add Drafts page by @krantheman in #38
- fix: adjustments needed for rcpt blocking by @s-aga-r in #40
- docs: add frontend ui screenshots by @krantheman in #41
- refactor: drop pytz by @akhilnarang in #43
- feat: add Settings by @krantheman in #42
- refactor: rename app back to mail by @s-aga-r in #45
- feat: upgrade send mail dialog by @krantheman in #44
- refactor!: use Stalwart as Mail Agent by @s-aga-r in #46
- feat: docker setup by @s-aga-r in #56
- chore: auto create DMARC account for root domain by @s-aga-r in #57
- refactor: rename
Mail Agent Job->Mail Agent Request Logby @s-aga-r in #58 - fix: enqueue external DMARC record update by @s-aga-r in #60
- refactor: user default email address by @s-aga-r in #61
- feat: send email from alias by @s-aga-r in #62
- feat: Signup flow by @krantheman in #47
- fix: reload configuration on settings change by @s-aga-r in #64
- refactor: Mail Tenant by @s-aga-r in #65
- feat: add permission for Mail Tenant and Mail Tenant Member by @s-aga-r in #66
- feat: add permission for Mail Domain Request by @s-aga-r in #67
- feat: add permission for Mail Domain by @s-aga-r in #69
- build: move build-email-css to frontend package.json by @krantheman in #70
- chore: bump vite to v6 by @krantheman in #71
- feat: add permission for Mail Account Request by @s-aga-r in #72
- feat: add/remove Mail Admin role from Tenant Member by @s-aga-r in #73
- feat: add permission for Mail Account by @s-aga-r in #74
- feat: add permission for Mail Group by @s-aga-r in #76
- chore: create default tenant for Administrator after install by @s-aga-r in #77
- fix: DMARC account creation for root domain by @s-aga-r in #78
- feat: add permission for Mail Group Member by @s-aga-r in #79
- revert(refactor): revert "refactor: use UUID naming" by @s-aga-r in #80
- feat: add permission for Mail Group Member by @s-aga-r in #82
- fix: reload each group agent on DKIM change by @s-aga-r in #87
- feat: add permission for Mail Alias by @s-aga-r in #88
- feat: add permission for outbound reports by @s-aga-r in #89
- feat: Admin Dashboard by @krantheman in #68
- fix: add rate limit to APIs by @s-aga-r in #93
- refactor: otp verification by @s-aga-r in #94
- ci: update eslint and add linting for vue by @krantheman in #96
- refactor: cache by @s-aga-r in #98
- feat: dynamic rate limiter by @s-aga-r in #97
- chore: add typescript by @krantheman in #99
- refactor: remove Ed25519 DKIM Key by @s-aga-r in #100
- chore(eslint): add import sorting by @krantheman in #102
- refactor: Mail Account Request expiry by @s-aga-r in #107
- refactor: transfer low-priority emails in batch by @s-aga-r in #106
- feat: OM outbox folder by @s-aga-r in #111
- refactor(API): use email address instead of account by @s-aga-r in #112
- fix: validate email subaddressing for account, group and alias by @s-aga-r in #113
- fix: validate duplicate email with normalized email by @s-aga-r in #114
- refactor: rename DocType
Bounce LogtoBounce Historyby @s-aga-r in #116 - feat: sender based
Bounce Historyby @s-aga-r in #117 - refactor: remove
tokenfromENVIDby @s-aga-r in #118 - refactor: remove fields
retriesandresponsefrom MR by @s-aga-r in #119 - refactor: remove
Outgoing Mailstatuses by @s-aga-r in #120 - feat:
ignored_ipson Rate Limit by @s-aga-r in #121 - refactor: remove include exclude agents fields from OM and MD by @s-aga-r in #122
- feat: UI enhancements and fixes by @krantheman in #104
- feat: Trash by @krantheman in #125
- feat(Admin Dashboard): Member Mail Account by @krantheman in #129
- feat: Mail Server Config by @s-aga-r in #123
- feat: outbound-only Mail Server by @s-aga-r in #132
- feat: add Mail Aliases page by @krantheman in #131
- chore: button to sync DNS Record with DNS Provider by @s-aga-r in #134
- feat: Mail Server Stores by @s-aga-r in #133
- feat:
Mail Server TLS Certificateby @s-aga-r in #136 - feat: add Mail Group by @krantheman in #135
- feat:
Mail Server ACME Providerby @s-aga-r in #137 - refactor: Domain by @krantheman in #139
- feat(UserDropdown): add App Switcher by @krantheman in #140
- feat: add search and filter for all lists by @krantheman in #141
- feat: view attachments by @krantheman in #143
- feat: Forgot Password by @krantheman in #145
- fix: configuration parse error for
cluster.bind-addrby @s-aga-r in #147 - fix: create spf ehlo dns record for mail server by @s-aga-r in #148
- feat: settings to enable Personal Signup by @s-aga-r in #150
- feat: add basic responsiveness by @krantheman in #151
- feat: Message Queue by @s-aga-r in #153
- feat: provision to reload individual Mail Server by @s-aga-r in #160
- refactor: use
dns-lexiconto manage DNS Records by @s-aga-r in #162 - feat:
Blocked IPby @s-aga-r in #163 - feat:
Allowed IPby @s-aga-r in #164 - feat: add personal sign up by @krantheman in #161
- feat: Allowed and Blocked IPs in Rate Limit by @s-aga-r in #166
- feat: Public and Private Mail Cluster by @s-aga-r in #167
- feat(Mailbox): bulk actions by @krantheman in #168
- refactor: use iframe via
@iframe-resizerto render mail html by @krantheman in #170 - fix: html body rendering on mobile by @krantheman in #171
- refactor: Settings by @krantheman in #172
- feat:
Email Messageby @s-aga-r in #169 - feat: Full Width View by @krantheman in #174
- feat: JMAP Push Subscription by @s-aga-r in #173
- feat: Invites page by @krantheman in #176
- refactor: rename
Mail Clusterfields based onconfig.tomlby @s-aga-r in #175 - refactor: organize functions in mail_server.py by @s-aga-r in #177
- refactor: Mail Backend Request by @s-aga-r in #178
- feat: send emails via JMAP - Part 1 by @s-aga-r in #182
- feat: send emails via JMAP - Part 2 by @s-aga-r in #185
- chore: make required changes for stalwart v0.12.x by @s-aga-r in #187
- feat: Sync JMAP Identities by @s-aga-r in #188
- refactor: rename
Mail GrouptoMailing Listby @s-aga-r in #190 - feat: Mailing List external members by @s-aga-r in #191
- fix: create JMAP Push Subscription on each server by @s-aga-r in #192
- refactor: use JMAP APIs by @krantheman in #186
- fix(SendMail): from_email selection by @krantheman in #199
- feat: inline images by @krantheman in #200
- fix: calling
get_mailboxesquery for non mail users by @krantheman in #206 - refactor(Mobile): sidebar instead of bottom tabs by @krantheman in #207
- feat: show no. of unseen mails in sidebar by @krantheman in #209
- refactor: remove stale code by @s-aga-r in #196
- feat(Mailing List): add external members by @krantheman in #211
- feat: add starring by @krantheman in #213
- refactor:
DMARC Reportby @s-aga-r in #214 - feat(MailboxView): add filters by @krantheman in #216
- feat: Vacation Response by @s-aga-r in #215
- feat: full text search by @krantheman in #217
- feat: vacation response by @krantheman in #219
- feat(Mail Account Request/InvitesView): make Expires At editable by @krantheman in #221
- fix(MailThread): rendering mails on mobile by @krantheman in #222
- refactor: remove setCurrentThread by @krantheman in #223
- feat: PWA by @krantheman in #225
- feat: Mail Import/Export by @s-aga-r in #224
- feat: add shift select by @krantheman in #226
- feat(pwa): allow tap and long touch selection by @krantheman in #227
- feat: Quota Management by @s-aga-r in #228
- feat(pwa): UI enhancements by @krantheman in #229
- refactor: Vacation Response by @s-aga-r in #230
- refactor: move Vacation Response to new tab by @krantheman in #231
- feat(JMAP):
MT-Priority - Mixerby @s-aga-r in #232 - fix: use lock while fetching email changes by @s-aga-r in #235
- feat: Dark mode by @krantheman in #241
- fix: sanitize mail html properly using dompurify by @krantheman in #248
- feat: Mailbox Management by @s-aga-r in #246
- feat(MailListItem): quick actions by @krantheman in #250
- refactor: use mailbox id instead of role everywhere in ui by @krantheman in #249
- refactor: Mail Data Exchange by @s-aga-r in #253
- feat: Mail Cluster - Log & Metrics by @s-aga-r in #254
- feat(AdvancedSettings): add Mail Data Exchange by @krantheman in #255
- refactor!: fetch messages from server by @s-aga-r in #260
- refactor: update APIs to accommodate #260 by @krantheman in #261
- feat: improve mail thread and send mail by @krantheman in #262
- fix(PWA): spacing and font size by @krantheman in #270
- chore: use app-password to access JMAP by @s-aga-r in #269
- feat(PWA): push notifications by @krantheman in #271
- feat: simulating relevance search by @s-aga-r in #274
- fix: render plain text as HTML by @s-aga-r in #275
- fix: preview text by @s-aga-r in #276
- feat: thread navigation by @krantheman in #277
- feat: mark as junk by @krantheman in #278
- chore: freeze jmap push notifications when importing by @s-aga-r in #283
- feat: process mail queue in read-only mode by @s-aga-r in #284
- feat: Mail Server Deployment by @s-aga-r in #293
- perf: concurrent download blobs by @s-aga-r in #294
- feat(Mailbox): add thread group collapse & select by @krantheman in #295
- feat: appearance settings by @krantheman in #296
- chore: bump frappe-ui to v0.1.204 by @krantheman in #297
- chore: take
sortas a param toemail_queryby @s-aga-r in #300 - feat: per-cluster SPF record by @s-aga-r in #299
- feat: advanced search by @krantheman in #302
- feat: Keyboard shortcuts by @krantheman in #307
- feat: allow navigation and selection via arrow keys without opening mail by @krantheman in #309
- feat: Mail Server Service by @s-aga-r in #312
- feat: improve PWA by @krantheman in #311
- refactor: JMAP Client by @s-aga-r in #318
- fix(Editor): mail formatting by @krantheman in #319
- feat: add state indicator toasts by @krantheman in #322
- feat: Address Book & Contact Card by @s-aga-r in #317
- feat: Undo by @krantheman in #323
- refactor: rename field
_idtoidby @s-aga-r in #324 - refactor: Client and Server module by @s-aga-r in #325
- refactor: move email creation to
jmap.pyby @s-aga-r in #328 - feat(ui): Quota Management by @krantheman in #329
- feat: JMAP Identity by @s-aga-r in #330
- feat(UI): basic mailbox management by @krantheman in #332
- feat: Quota by @s-aga-r in #331
- feat: Identity & Signature by @krantheman in #334
- chore: remove redundant fields by @krantheman in #335
- feat: generic JMAP client by @s-aga-r in #333
- fix: update Redis host configuration in init script by @asaura08 in #340
- chore: update readme by @krantheman in #346
- build(deps): bump to python>=3.14, nodejs>=24 by @s-aga-r in #347
- feat:
Mail Exchangeby @s-aga-r in #345 - fix: block framework endpoints by @s-aga-r in #350
- Add no_cache variable to mail.py by @gbatkhuyag in #352
- feat(ComposeMail): add drag and drop and multiple file upload by @krantheman in #360
- feat: attachment viewer by @krantheman in #371
- fix: quoted-printable encoding and code formatting by @krantheman in #375
- feat: Contacts by @krantheman in #343
- refactor!: remove
validate-email-addresslib by @s-aga-r in #378 - fix: remove unsafe quoted-printable decoding in EmailContent by @s-aga-r in #390
- fix: attachments by @s-aga-r in #373
- fix: Contact Card by @s-aga-r in #396
- refactor: replace Mail Data Exchange with Mail Exchange by @krantheman in #395
- feat: JMAP Calendars by @s-aga-r in #341
- feat: Sieve Script by @s-aga-r in #397
- feat: show user avatars by @krantheman in #398
- refactor: split
jmap.pyinto services by @s-aga-r in #401 - feat: Mailbox Settings by @s-aga-r in #403
- feat: User Settings by @s-aga-r in #411
- feat: Push Subscription
keysby @s-aga-r in #414 - feat:
mail.pushlogger by @s-aga-r in #415 - feat: setting to disable push notification for mailbox by @s-aga-r in #418
- feat: switch from yarn to bun by @krantheman in #419
- refactor: rename
Mail Principal *toPrincipal *by @s-aga-r in #423 - Folder settings by @krantheman in #429
- refactor!: remove
Mail Tenantby @s-aga-r in #427 - feat: Sieve by @krantheman in #433
- fix: handle nested mailboxes when updating automated sieve by @s-aga-r in #442
- feat:
Blocked Email Addressby @s-aga-r in #437 - refactor(Theme): add useTheme by @krantheman in #445
- refactor: remove cluster field from IP, DMARC Report and Queue by @s-aga-r in #447
- refactor:
Mail SettingsandMail Clustercleanup by @s-aga-r in #455 - feat: shared account/mailbox by @s-aga-r in #430
- feat: mail grouping by date and mark unread from here by @krantheman in #461
- feat: use RocksDB as DataStore by @s-aga-r in #458
- feat: archive & starred by @krantheman in #471
- feat: Collapsed Group by @krantheman in #473
- fix(auth): add meet api path to allow list by @BreadGenie in #474
- fix: scope app list cache to user by @BreadGenie in #475
- feat: improved recipient input by @krantheman in #481
New Contributors
- @pateljannat made their first contribution in #5
- @krantheman made their first contribution in #37
- @akhilnarang made their first contribution in #43
- @asaura08 made their first contribution in #340
- @gbatkhuyag made their first contribution in #352
- @BreadGenie made their first contribution in #474
Full Changelog: https://github.com/frappe/mail/commits/v0.1.0