- Shipped
- August 7, 2026 at 12:55 AM UTC
- Author
- kamo
- Commit
- 8342071
The recipient autocomplete only knew contacts and addresses scraped out of the Sent folder, so the organisation's own addresses — everything managed on **************** — had to be typed from memory. New GET /api/email/directory fans out to the four EmailService sources behind that page and returns one deduped address list. Aggregated server-side because each of those calls consumes its own one-time key; from the browser it would be four OTK round trips every time a composer opens. Each source degrades on its own, so an org whose provider has no provisioning still gets its aliases. The list is cached in memory and matched locally — orgs have tens of these, not thousands, and a query parameter per keystroke would put a network round trip in front of suggestions the browser can already answer. Org matches therefore paint immediately while the contact and Sent-folder lookups are still in flight, and they lead the dropdown: it is a small exact set, and an internal address that also sits in a contact book should read as the mailbox, not the contact card. Editing mailboxes in Settings drops the cache, so a new address is suggestable without a reload. EmailService's base-URL and forward helpers move out of the catch-all route so the new route mints its OTK the same way instead of keeping a second copy.