Lange angekündigt – nun Realität: Microsoft hat die Authentifizierung per Passwort für bestimmte Protokolle in Exchange Online ab September 2022 zu Gunsten von oAuth2 abgeschaltet. Die GitHub Issues vieler Libraries und Backup-Scripte verdeutlichen, dass die Umstellung viele Administratoren kalt erwischt hat. Nachfolgend zeigen wir einen Weg, wie man mit Hilfe von oAuth2 per PHP via IMAP weiterhin auf die Inhalte seines Exchange-Postfachs zugreifen kann.
Aus Security-Gesichtspunkten ist der Schritt von Microsoft sehr richtig, aber die Komplexität des programmatischen Zugriffs auf seine E-Mails hat um einiges zugenommen. Nutzt man beispielsweise die weit verbreitete Library barbushin/php-imap, gelang der Zugriff früher wie folgt:
734a82898010e2fcb02c72c3cd9702c2
Das klappt nun so einfach nicht mehr. Um eine Verbindung via oAuth2 herzustellen, besteht die Schwierigkeit zunächst darin, an das Access Token zu kommen. Und hierfür muss man zunächst man zwei Hürden auf sich nehmen.
Azure Active Directory
Die folgenden Schritte registrieren eine neue App im Azure Active Directory:













PowerShell
Nun schalten wir die App in der Microsoft PowerShell (Administrator-Modus) frei und weisen den einzelnen Postfächern Berechtigungen zu (<TENANTID>, <CLIENTID>, <OBJECTID>, <EMAIL> müssen jeweils ersetzt werden):
Install-Module -Name ExchangeOnlineManagement
Import-Module ExchangeOnlineManagement
Connect-ExchangeOnline -Organization <TENANTID>
New-ServicePrincipal -AppId <CLIENTID> -ServiceId <OBJECTID>
Add-MailboxPermission -Identity "<EMAIL>" -User <OBJECTID> -AccessRights FullAccess
...
Nachdem man das geschafft, ist der Rest kein Hexenwerk mehr. Da barbushin/php-imap oAuth2 nicht unterstützt, kann man beispielsweise mit der alternativen Library Webklex/php-imap (die obendrein den Vorteil hat, das PHP-Modul IMAP nicht zu benötigen) eine Verbindung herstellen:
734a82898010e2fcb02c72c3cd9702c2
Doch auch Libraries, die offiziell kein oAuth2 unterstützen, kann man mit Hilfe eines Proxies wie simonrob/email-oauth2-proxy lauffähig machen. Nach dem Download und der Installation via python -m pip install -r requirements-no-gui.txt (Python ≥3.6 vorausgesetzt) editiert man die Datei emailproxy.config beispielsweise wie folgt (und ersetzt dieses Mal <TENANTID>, <CLIENTID>, <CLIENTSECRET> und <EMAIL>):
[Server setup]
[IMAP-1993]
local_address = localhost
server_address = outlook.office365.com
server_port = 993
[Account setup]
[<EMAIL>]
token_url = https://login.microsoftonline.com/<TENANTID>/oauth2/v2.0/token
oauth2_scope = https://outlook.office365.com/.default
redirect_uri = http://localhost:8080
client_id = <CLIENTID>
client_secret = <CLIENTSECRET>
Anschließend startet man den Proxy mit python emailproxy.py --no-gui und kann unverschlüsselt nun zur IP localhost auf Port 1993 via regulärem Basic Auth (und beliebig gesetztem Passwort) verbinden. Will man den Proxy beim Systemstart als Dienst im Hintergrund starten, nutzt man beispielsweise systemd:
sudo systemctl edit --force --full emailproxy.service
[Unit]
Description=Email OAuth 2.0 Proxy
[Service]
ExecStart=/usr/bin/python /path/to/emailproxy.py --no-gui
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl enable emailproxy.service --now
sudo systemctl status emailproxy.service
sudo systemctl start emailproxy.service
Wird eine verschlüsselte Verbindung vorausgesetzt, ist auch das möglich – hierfür erstellt man zunächst einen privaten Schlüssel sowie ein selbst signiertes Zertifikat:
openssl genrsa -out key.pem 3072
openssl req -new -x509 -key key.pem -out cert.pem -days 360
Anschließend referenziert man in der emailproxy.config diese beiden Dateien:
local_key_path = /path/to/key.pem
local_certificate_path = /path/to/cert.pem
E-Mail-Versand
Wer E-Mails programmatisch über Microsoft Exchange Online versenden möchte, steht ebenfalls vor einer grundlegenden Änderung: Microsoft hat die klassische Authentifizierung per Benutzername und Passwort auch für SMTP in Exchange Online abgeschaltet. Was jahrelang mit wenigen Zeilen Code erledigt war, erfordert nun den Umweg über oAuth2 – inklusive App-Registrierung im Azure Active Directory, Zertifikaten und Token-Management. Neben dem Empfang von E-Mails können wir auch den Versand entsprechend umsetzen.




Der SMTP-Versand über Microsoft Exchange 365 folgt dabei dem gleichen Prinzip wie der IMAP-Zugriff: Auch hier führt seit der Abschaltung der Basic Authentication kein Weg mehr an oAuth2 vorbei. Nachdem man in der Azure-App-Registrierung die Berechtigung „SMTP.SendAsApp" hinzugefügt und die Administratorzustimmung erteilt hat, lässt sich der Versand beispielsweise mit PHPMailer realisieren. Statt wie früher einfach Benutzername und Passwort zu übergeben, authentifiziert man sich nun mit einem Access Token gegen den SMTP-Server smtp.office365.com:
734a82898010e2fcb02c72c3cd9702c2
Der Mehraufwand bei der Einrichtung mag zunächst abschreckend wirken, zahlt sich aber langfristig aus: Die oAuth2-basierte Authentifizierung ist deutlich sicherer, da keine Klartext-Passwörter mehr in Konfigurationsdateien oder Scripten hinterlegt werden müssen – und das Access Token lässt sich zudem zeitlich begrenzen und granular in seinen Berechtigungen steuern. Erwähnenswert ist an dieser Stelle auch die Library mailhelper, die eine bequeme API für den Empfang und Versand von E-Mails bietet.