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
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 three equal choices with the providers' icons:

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).

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 Your mail card and its Connect your accounts card carry All your mail accounts →, 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