← deemwar engineering examples Runnable · Node · zero deps · free · offline

EWS is switched off for good on 2027-04-01. Some of what you do with it never comes to Graph.

Most EWS code ports to Microsoft Graph. This page is about the part that does not, the licence it quietly needs, and the tenants that allow-listed an app last October and think they have time.

The dates

What is not carried over

Two source classes, never blurred: the vendor's own docs are authoritative; community reports are real, dated and linked, but not vendor-confirmed, and they are labelled that way.

From the vendor's published docs

The price trap

Reported by users, not confirmed by the vendor

Check your own setup

Zero dependencies and offline: it reads your source tree and never connects to your tenant. It never asks for, stores or transmits a credential: you run it with your own login, and nothing leaves your machine.

node scan.js ./your-repo
node scan.js --demo

# and in Exchange Online PowerShell, your own session:
Get-OrganizationConfig | Format-List EwsEnabled,EwsApplicationAccessPolicy,EwsAllowList
$ node scan.js --demo Exchange Online EWS is fully disabled 2027-04-01 . Scanning 5 files [DEMO DATA] EWS Sync/MailSync.cs:1 var svc = new ExchangeService(ExchangeVersion.Exchange2013_SP1); EWS client usage: this path stops working 2027-04-01 unless moved to Graph. NOT YET Archive/Archiver.cs:1 var root = Folder.Bind(svc, WellKnownFolderName.ArchiveMsgFolderRoot); Archive mailbox access is still a roadmap target (Q4 CY2026); "don't plan on" anything not in the roadmap table. NO GRAPH Legal/Hold.cs:1 var boxes = svc.GetSearchableMailboxes("", false); Discovery mailbox access will not come to Graph; Microsoft points to Purview eDiscovery APIs, where app-only auth "require[s] E5 or an equivalent add-on". NO GRAPH Shared/Board.cs:1 var pf = Folder.Bind(svc, WellKnownFolderName.PublicFoldersRoot); Generic public folder CRUD is on Microsoft's "won't be added to Microsoft Graph" list. EWS import/restore.py:1 from exchangelib import Account EWS client usage: this path stops working 2027-04-01 unless moved to Graph. CHECK import/restore.py:2 acct.upload([(folder, mime_bytes)]) # .eml restore Import paths differ in Graph; one public report says Graph cannot import .eml with the original received date (community, not vendor-confirmed). SUMMARY: 2 EWS, 1 NOT YET, 2 NO GRAPH, 1 CHECK Lines marked NO GRAPH have no Microsoft Graph replacement coming. They need a redesign, not a port. Source: https://learn.microsoft.com/en-us/exchange/clients-and-mobile-in-exchange-online/deprecation-of-ews-exchange-online Also check the tenant: Get-OrganizationConfig | Format-List EwsEnabled,EwsApplicationAccessPolicy,EwsAllowList Any app on the allow list is running on borrowed time: on 2027-04-01 "The ability to control EWSEnabled will be removed from tenant admins."

The part nobody checks

Teams port the calls they know about, then learn about the rest when the allow list stops working. Two checks close that gap: scan every repository and scheduled script for EWS (not just the main app), and read the tenant's allow list, since every app on it is a dependency with a date. After the port, prove each workflow end to end on Graph with EWS switched off for that app, before April does it for you.

If you would rather not do it yourself

We take this on as fixed scope, and we will say plainly that you would be among our first customers for this particular engagement. What we bring is the breakage map above and a hard habit of proving the new setup works rather than assuming it.