Mail accounts — every account from the Mail app

A person finds every account their inbox reads in ONE place: the Mail app's accounts view, /{user}/MailAccounts. Before it, setting up mail was spread over five places nobody could connect — the setup wizard's Connect your accounts and Your mail cards, /{user}/AddMailAccount, the Google account page and the Settings tab Google grants — and the inbox linked to none of them (maintainer, 2026-10-30: "this must all be reachable from mail app").

The view composes what already exists. It builds no connect flow of its own.

What the view shows

Part Where it comes from
One row per mail & calendar and messaging connection this installation offers — Microsoft 365, Google, Other email (IMAP/SMTP), iCloud, Other calendar, Teams, WhatsApp, iMessage the registered IConnectionProviders and their state from ConnectionCatalog (MailAccountsArea.Rows)
Each row's state: Connected, Not connected, Needs attention (the provider refused the credential), Couldn't check MailAccountsArea.StateOf; couldn't check is never advice to reconnect (#3433)
Each row's one action not connected / refused → the provider's OWN connect flow (Connect), returning to the view; connected or couldn't check → where it is managed: the Google account the inbox READS (located through IMailAccountLocator, which the Google package's module registers: the reader's own selection applied to the hub's content-bearing synced query of the owner's accounts, so an account added, removed or edited in place moves the link even when no connection's health changes — never a guessed path), else the Settings app's Connections tab, where a credential set's stored accounts (imap--{suffix}) are listed with their own forms; a refused credential set is fixed there too
Add account the AddMailAccount step (below) — offered where the Google package brings it
A note that the assistant may create SharePoint files (never replace one) and why Microsoft asks for consent again — only where SharePoint:AgentWrite=Write MailAccountsArea.SharePointWritesNote, text MailAccountsTexts.AssistantCreatesSharePointFiles (EN/DE); see Microsoft Graph scopes → Writing to SharePoint
Your mail the existing MailPreferences and MailCopySettings areas, embedded — their bindings are their own
The outcome of the last connect read off the query the flow came back with (eaConnect, googleConnect + account), MailAccountsArea.Outcome. Nothing on the query is rendered as markup; an account is linked only when it is a path in the owner's own partition

Add account

/{user}/AddMailAccount is the view's Add account step: one line, Which account do you want in your inbox?, and one tile per provider in the Getting-started tiles' shape (OnboardingWizardArea.Tile): a Skins.Card filling its grid cell, the provider's icon and short name, one quiet line of detail, and an Accent button at the foot whose visible word is the action and whose accessible name names the provider (AddMailAccount.TileButtonLabel). No address is typed for Google or Microsoft (maintainer, 2026-11-07: asking for the address before the OAuth sign-in that provides it was friction):

With no address given, a live Google connection already on the node is refused ("… is connected; disconnect it first"): the consent would otherwise replace it with whichever account Google is signed in with. A binding the mother no longer honours is residue and is cleared with any old address (AddMailAccount.WithAddress(node, "")), so the new consent is never held to it.

In the apps. The press answers with a NavigationRequest with forceLoad to a server endpoint (/api/google/connect/start, /auth/ea/connect). The React Native shell used to resolve that as a mesh path, a page that does not exist, so Connect did nothing there. It now leaves the app (leavesTheApp, the twin of ServerEndpointPaths): in the macOS desktop app through the same system sign-in sheet as the app's own sign-in (openOutside, the memexAuth bridge, sharing the system browser's cookies), elsewhere in the browser. The flow ends on the portal's accounts view inside the sheet, and the person closes it; the app's page updates from the mesh. Closing the sheet by itself at the end needs a memex:// return on the connect routes, which is still owed.

POP3 is not offered: no POP reader exists in this repository, and none was invented.

The long explanation sits in a collapsed How this works section (the platform's expander skin), set as quiet hint prose on a transparent background (the Markdown view otherwise paints its own layer, which read as a heavy dark box under the tiles). Back to your accounts is a Stealth button with a link (WithNavigateToHref), not a click handler. The breadcrumb reads the area as words, Add mail account (BreadcrumbArea.Label in the Blazor portal, areaLabel in the React Native shell), never the raw id.

Every consent ends on the accounts view: Microsoft's return URL is the view, and the Google connect's start and return routes (BrokerEndpoints.BackUrl) redirect to /{user}/MailAccounts?googleConnect={outcome}&account={path} — the outcome is still written on the account node, so the account page says it too. A refusal the step itself decides (an address that is not one, another Google address already connected) is said on the step, next to Back to your accounts.

The way in, from the inbox

Core's unified inbox embeds every UiContribution of context Inbox above its list. Mail contributes Mail/Inbox/Accounts, which embeds the InboxAccounts area of the person's own user node:

The other places point INTO the view: the setup wizard's Connect your accounts card carries All your mail accounts → (its Your mail card is the handling preferences only, so the two cards never lead to the same page — 2026-11-07), the Google account page opens with ← Your mail accounts, and the Google grants tab has Your mail accounts.

Inbox fixes made with it

What was not established