MSXFAQ MeetNow aktiv: Komm doch einfach dazu.

Exchange Online IMAP4 Service Zugriff

EWS wurde im Oktober 2026 in der Cloud deaktiviert und alle automatischen Zugriffe auf Postfächer können die Microsoft Graph API nutzen. Für viele automatisierte Prozesse sind aber POP3/IMAP4 immer noch gerne genutzte Wege. Auch mit Exchange Online können Sie per IMAP als Service auf andere Postfächer zugreifen. Sie müssen sich nur die Berechtigungen geben. Wobei wir hier nicht darüber reden, wie ein Benutzer ein anderes Postfach mit öffnen kann, sondern wie ein automatischer Prozess ohne Multi Faktor solche Abfragen machen kann. Dazu brauchen Sie eine App Registration.

Einrichten der App und Rechte

Der Zugriff auf ein Postfach per IMAP4 ist aus meiner Sicht natürlich nur der zweibeste Weg, da über IMAP viele Informationen in Exchange nur eingeschränkt abrufbar sind. Sie können zwar sehr einfach noch Mails lesen, senden, verschieben und löschen. Zugriffe auf Termine, Aufgaben und Kontakte sind so aber nicht mögliche. Für IMAP gibt es es aber auch keine "RBAC for Applications" sondern eine andere Berechtigungsvergabe. Die Schritte zum Anlegen einer Application mit Secret sind identisch zur ersten Beschreibung. Der Unterschied ist die Vergabe der Berechtigungen.

Schritt Erledigt

Entra ID Application anlegen

Zuerst müssen Sie in Entra ID eine Application anlegen.

Entra ID legt in ihrem Tenant dann auch eine Enterprise Registration an.

App Secret

Damit sich die Application authentifizieren kann, müssen Sie entweder ein Kennwort von Entra ID generieren lassen. Ich bevorzuge die Anmeldung mittels Zertifikat und lege mir dazu immer ein eigenes "SelfSigned-Zertifikat auf dem System an, auf dem der Prozess läuft. Per PowerShell ist das schnell gemacht:

# Selbst signiertes Zertifikat erstellen
$appcert = New-SelfSignedCertificate `
              -Subject "CN=MSXFAQ_MGGraph" `
              -CertStoreLocation "Cert:\CurrentUser\My"  `
              -KeyExportPolicy Exportable  `
              -KeySpec Signature  `
              -KeyLength 2048  `
              -KeyAlgorithm RSA  `
              -HashAlgorithm SHA256 `
              -notafter (get-date).addyears(5)

#Thumbprint merken
$appcert.Thumbprint

# Als Datei exportieren
Export-Certificate `
   -Cert $appcert `
   -FilePath "MSXFAQ_MGGraph.cer" 

Merken sie sich den Thumbprint für die spätere Konfiguration ihrer Applikation.

Diese CER-Datei lade ich dann im Entra ID Portal hoch.  

 

API Berechtigungen vergeben

Für den Zugriff per IMAP4 müssen Sie der Applikation aber die IMAP4-Rechte gewähren. Suchen Sie dazu zuerst nach der Schnittstelle "Office 365 Exchange Online"

Dann wechseln Sie wieder auf "Application permissions" und suchen nach IMAP.

Ich habe hier auch noch das SMTP-Versand-Recht addiert. Das ist aber nur erforderlich, wenn ihr Service auch per SMTP im Namen der anderen User senden soll.

Auch dieses Rechte müssen Sie danach mit Admin Consent noch gesondert freischalten. 

Anders als bei Graph hat die App damit aber noch keine Rechte auf Postfächer sondern es ist nur die Anmeldung per IMAP4 erlaubt.

Service Principal

Sie müssen dann wieder mit der Exchange Online PowerShell einen Service Principal anlegen aber dieses Objekt bekommt dann die Rechte mit "Add-MailboxPermission´" auf die gewünschten Postfächer. Zuerst müssen wir ein ServicePrincipal anlegen. Die Benötigten Felder können Sie mit "Get-MgServicePrincipal" oder das Entra ID AdminCenter abfragen.

Wichtig:
Die ObjectID bezieht sich auf die ID der Enterprise Application und nicht der App-Registration. Den Displaynamen können sie frei wählen. Es bietet sich natürlich an, den Namen der EnterpriseApp zu übernehmen.

New-ServicePrincipal `
   -AppId <AppID der Enterprise Application in Entra ID `
   -ObjectId <ObjectID der Enterprise Application in Entra ID>
   -DisplayName "MSXFAQ IMAP4App1"

Der so neu angelegte ServicePrincipal hat natürlich auch wieder eine ID, die wir im nächsten Schritt benötigen.

Postfachrechte

Im zweiten Schritt können wir dem Service Principal die Berechtigungen auf das Postfach geben.

Add-MailboxPermission `
   -Identity "user1@msxfaqdev.de" `
   -User $ServicePrincipal.Id `
   -AccessRights FullAccess

Diese Berechtigungen können Sie auch im Exchange Admin Center bei "Full Access" sehen.

Wenn ihre App keine Mails abrufen sondern nur Senden soll, dann können Sie Rechte hier auch auf "SendAs" oder "SendOnBehalf" beschränken.

Damit ist die Konfiguration der Applikation und deren Berechtigungen abgeschlossen.

OAUTH und Zugriff per IMAP4

Die nächste Herausforderung ist nun die Anmeldung mit dem IMAP4-Client per OAUTH. Das ist dann eine Aufgabe ihrer Applikation, die statt Graph auf IMAP4 aufsetzt und mit Exchange Online kompatibel sein will. Sie muss zumindest OAUTH unterstützen, damit eine Anmeldung mit "AppID" und "AppSecret" möglich ist. Die Application muss sich zur Anmeldung natürlich immer noch per OAUTH2 ein Token Um sich per IMAP4 nun anzumelden, braucht ihre Software eine Token, welches es sich vorher abrufen muss. Dazu brauchen wir wieder die ClientID der App-Registration (nicht die Enterprise Application).

$Body = @{
    client_id     = $ClientId
    scope         = "https://outlook.office.com/.default"
    client_secret = $AppSecret
    grant_type    = "client_credentials" 
}

# Get OAuth 2.0 Token
$TokenRequest = Invoke-WebRequest `
   -Method POST `
   -Uri "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" `
   -ContentType "application/x-www-form-urlencoded" `
   -Body $Body `
   -UseBasicParsing

$Token = ($tokenRequest.Content | ConvertFrom-Json).access_token

Der Inhalt von "$token" sollte ein SAML-Token sein, welches Sie z.B. auf jwt.io oder jwt.ms decodieren können. Mit der Information des Username und des Tokens können Sie dann ganz klassisch eine IMAP4-Anmeldung gegen Exchange ausführen.

Die gleiche Funktion können Sie auch mit CURL ausführen. Hier habe ich die Parameter mit "-d" addiert und nicht als JSON-Formular in den Daten mitgeliefert.

CLIENT_ID="ClientID hier addieren"
CLIENT_SECRET="ClientSecret hier addieren"
TENANT_ID="TenantID hier addieren"

curl \
  --request POST \
  --header "Content-Type: application/x-www-form-urlencoded" \
  --header "Accept: application/json" \
  --user "$CLIENT_ID:$CLIENT_SECRET" \
  --data "grant_type=client_credentials" \
  --data "scope=https://outlook.office.com/.default" \
  "https://login.microsoftonline.com/$TENANT_ID/oauth2/v2.0/token"

Sie müssen im Aufruf natürlich die Werte für "<Client_ID>", "<ClientSecret>" und "<TenantID>" durch ihre App Registration ersetzen. Eventuell müssen Sie die Anmeldedaten noch BASE64 kodieren, wenn dort Sonderzeichen vorkommen. S

Sowohl per Powershell als auch per CURL bekommen Sie dann das SAML-Token, welches 60 Minuten gültig ist. Dieses müssen Sie dann mit dem Usernamen des Postfachs und das Token kombinieren und BASE64 codieren.

base64("user=" + userName + "^Aauth=Bearer " + accessToken + "^A^A")

Den String nutzen Sie dann bei der Anmeldung:

AUTHENTICATE XOAUTH2 <base64 string in XOAUTH2 format>

Exchange sollte sie dann entsprechend "willkommen" heißen und danach geht es mit den normalen IMAP4-Befehlen weiter.

Senden von Mails

Die IMAP4-Spezifikation erlaubt wohl einen Mailversand per IMAP4, indem Sie einfach eine Mail nach "Postausgang" legen. Das scheint Exchange Online aber nicht zu unterstützen. Insofern bleiben nur zwei Wege, nachdem EWS entfallen ist.

  • Microsoft Graph
    Über die "Maill.Send"-Methode können Sie eine Mail mittels Microsoft Graph senden. Durch das "Full Access". kann die App schon so tun, als wäre sie das Postfach. Wer stattdessen "SendAs" nutzen möchte, muss die Rechte etwas anpassen.
  • SMTP
    Natürlich können Sie sich auch per SMTP an "outlook.office.com:587" anmelden und Mails senden. Dazu benötigen Sie aber natürlich auch noch die entsprechenden Berechtigungen.

Für den Versand per SMTP müssen Sie sich natürlich auch erst wieder die Berechtigungen geben lassen und ein passendes Token anfordern. Hier ein Beispiel mit genau dem einen erforderlichen Recht. Sie können als scope natürlich auch wieder "https://oiutlook.office.com./default" nehmen und damit mit einem Token dann beide Funktionen ausführen.

$Body = @{
    client_id     = $ClientId
    scope         = "https://outlook.outlook.com/smtp-send"
    client_secret = $AppSecret
    grant_type    = "client_credentials" 
}

# Get OAuth 2.0 Token
$TokenRequest = Invoke-WebRequest `
   -Method POST `
   -Uri "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" `
   -ContentType "application/x-www-form-urlencoded" `
   -Body $Body `
   -UseBasicParsing

$Token = ($tokenRequest.Content | ConvertFrom-Json).access_token

Analog zu IMAP müssen Sie dann wieder bei SMTP den Username und das Token kombinieren und BASE64 codieren.

base64("user=" + userName + "^Aauth=Bearer " + accessToken + "^A^A")

Den String nutzen Sie dann bei der Anmeldung:

AUTH XOAUTH2 <base64 string in XOAUTH2 format>

Danach geht es mit den normalen SMTP-Befehlen weiter.

Rückbau

Wenn Sie den Zugriff nicht mehr benötigen, dann sollten Sie nacheinander die Schritte sauber wieder rückgängig machen:

Schritt Erledigt

Applikation beenden und Zertifikat löschen

Zuerst beenden sie die Applikation, die sich an Exchange Online mit der App Registration angemeldet hat. Damit sollte die Funktion beendet sein und niemand mehr sich mit der App Registration anmelden.

Sie können im Entra ID Portal die App zur Sicherheit auch noch "deaktivieren", so dass keine weitere Anmeldung mehr möglich ist.

Kontrolle der Anmeldungen

Nach einigen Tagen sollten Sie im Entra ID Portal auf die entsprechende "Enterprise Registration" gehen und auf verbliebene Anmeldungen kontrollieren. Im Idealfall gibt es keine Anmeldungen mehr oder sie sehen die fehlerhaften Anmeldeversuche an einer deaktivierten Applikation

Berechtigungen auf dem Postfach entfernen

Damit keine Altlasten übrig bleiben, sollten sie mit Remove-MailboxPermisssion die früher eingeräumten Berechtigungen wieder entfernen.

Service Principal entfernen

Danach können Sie den Exchange Service Principal entfernen, welchen Sie anfangs extra angelegt haben.

App-Registration entfernen

Der letzt Schritt ist dann die Löschung der App-Registration.

Weitere Links