So senden Sie E-Mails mit der Microsoft Graph-API und PowerShell

E-Mails über PowerShell zu versenden ist nicht immer einfach, insbesondere da Microsoft die Sicherheit ständig verschärft und die Unterstützung für ältere Methoden wie die Basisauthentifizierung einstellt. Wenn Sie das bewährte Send-MailMessageCmdlet in letzter Zeit verwendet haben, ist Ihnen vielleicht die Warnung aufgefallen, dass es veraltet ist. Typisch Windows, dass es die Dinge unnötig kompliziert macht. Moderne Microsoft 365-Mandanten deaktivieren die Basisauthentifizierung standardmäßig und drängen so alle Nutzer zur Verwendung der Graph-API, OAuth oder anderer moderner Methoden. Dieser Leitfaden erklärt, wie Sie mit PowerShell und der Graph-API E-Mails über Exchange Online oder Microsoft 365 versenden – was heutzutage fast schon Pflicht ist, wenn Sie moderne Authentifizierungsmethoden nutzen und die Compliance-Vorgaben einhalten möchten.

Es ist nicht perfekt, aber wenn Sie diese Schritte befolgen, sollten Sie E-Mails aus Ihren Skripten versenden können, ohne auf versteckte Anmeldefehler oder Sicherheitswarnungen zu stoßen. Nach der Einrichtung lässt sich der E-Mail-Versand problemlos automatisieren, ohne auf veraltete Funktionen angewiesen zu sein. Ziel ist es, Ihre Skripte mit der Microsoft-Cloud (über die Graph-API) zu verbinden, eine sichere Authentifizierung zu gewährleisten und E-Mails unkompliziert zu versenden. Natürlich ist etwas Feintuning erforderlich, insbesondere bei Berechtigungen und der Token-Generierung, aber zumindest vermeiden Sie so die beunruhigende Warnung vor Send-MailMessageder Abschaffung. Nur Geduld – es lohnt sich!

So beheben Sie Probleme beim E-Mail-Versand mit PowerShell und der Microsoft Graph-API

Berechtigungen in Azure AD für den E-Mail-Versand konfigurieren

Zunächst benötigen Sie eine Azure AD-App-Registrierung. Dies ist der wichtigste Schritt. Gehen Sie zum Azure Active Directory- Portal, dann zu „App-Registrierungen“ und klicken Sie auf „Neue Registrierung“. Geben Sie der App einen Namen und notieren Sie sich die Anwendungs-ID (Client-ID).Zur Authentifizierung benötigen Sie außerdem ein Geheimnis oder ein Zertifikat – je nachdem, was Sie bevorzugen. Für Tests ist ein Geheimnis in der Regel schneller.

Nach der Registrierung gehen Sie in Ihrer App-Registrierung zu „API-Berechtigungen“ und fügen Sie eine Berechtigung hinzu. Wählen Sie „Microsoft Graph“ und anschließend „Anwendungsberechtigungen“ aus Mail. Send. Fügen Sie die Berechtigung hinzu. Vergessen Sie nicht, anschließend die Administratorzustimmung für den Mandanten zu erteilen. Falls Sie dies manuell durchführen, benötigen Sie möglicherweise Administratorrechte. Wenden Sie sich in diesem Fall an Ihren Administrator.

Sobald die Berechtigungen eingerichtet sind, können Sie optional die Möglichkeit Ihrer App, im Namen bestimmter Postfächer E-Mails zu versenden, mithilfe einer Anwendungszugriffsrichtlinie einschränken. Dadurch wird verhindert, dass Ihr Skript wahllos E-Mails versendet – eine sinnvolle Sicherheitsmaßnahme.

Erstellen Sie als Nächstes eine Verteilergruppe in Exchange Online, z. B.„Verteilergruppe“ azappSendasAllowed, und fügen Sie das Dienstkonto oder die Benutzerpostfächer hinzu, von denen die App E-Mails senden darf:

New-DistributionGroup -Name "azappSendasAllowed" -Type "Security" -Members @("[email protected]") Set-DistributionGroup -Identity azappSendasAllowed -HiddenFromAddressListsEnabled $true 

Beschränken Sie anschließend den Zugriff Ihrer App mithilfe einer Richtlinie:

New-ApplicationAccessPolicy -AppId "YOUR-APP-ID" -PolicyScopeGroupId azappSendasAllowed -AccessRight RestrictAccess -Description "Restrict SendAs"

Und schließlich sollten Sie überprüfen, an welche Adressen Ihre App im Namen von Folgendem senden kann:

Test-ApplicationAccessPolicy -Identity [email protected] -AppId "YOUR-APP-ID"

Wenn alles konfiguriert ist, können Sie sich authentifizieren und die E-Mail senden. Das ist aber nur der Einrichtungsteil.

E-Mail-Versand mit Invoke-RestMethod und Graph-API

Jetzt wird es etwas technischer. Um die E-Mail tatsächlich zu versenden, benötigen Sie ein OAuth-Token für Ihre registrierte App. Dazu verwenden Sie das Invoke-RestMethodCmdlet, um den Token-Endpunkt aufzurufen:

$AccessSecret = "YOUR-APP-SECRET" $AzureAppID = "YOUR-CLIENT-ID" $tenantID = "YOUR-TENANT-ID" $tokenBody = @{ Grant_Type = "client_credentials" Scope = "https://graph.microsoft.com/.default" Client_Id = $AzureAppID Client_Secret = $AccessSecret } $tokenResponse = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenantID/oauth2/v2.0/token" -Method POST -Body $tokenBody $headers = @{ "Authorization" = "Bearer $($tokenResponse.access_token)" "Content-type" = "application/json" } 

Dieser Teil ist etwas ungewöhnlich – ich bin mir nicht sicher, warum es bei manchen Konfigurationen funktioniert und bei anderen nicht. Dieses Token ermöglicht Ihrem Skript jedoch die sichere Kommunikation mit Graph. Wenn alles korrekt eingerichtet ist, sollte ein Zugriffstoken als Ausgabe angezeigt werden.

Um die E-Mail zu versenden, erstellen Sie nun die gewünschte JSON-Nutzlast. Hier ist ein Beispiel:

$MailFrom = "[email protected]" $MailTo = "[email protected]" $URLsend = "https://graph.microsoft.com/v1.0/users/$MailFrom/sendMail" $BodyJsonsend = @" { "message": { "subject": "Test email from Graph API", "body": { "contentType": "HTML", "content": "This email is sent via Microsoft Graph APIPretty nifty, huh?" }, "toRecipients": [ { "emailAddress": { "address": "$MailTo" } } ] }, "saveToSentItems": "true" } "@ Invoke-RestMethod -Method POST -Uri $URLsend -Headers $headers -Body $BodyJsonsend 

Wenn alles gut geht, sollte der Empfänger Ihre E-Mail erhalten. Es ist etwas fehleranfällig, und das Debuggen von JSON fühlt sich manchmal an wie das Basteln einer Bombe, aber heutzutage ist es die einzige Möglichkeit, wenn man moderne Sicherheit gewährleisten will.

Verwenden Sie das Modul Send-MgUserMail aus Microsoft. Graph.

Wenn Sie eine etwas elegantere und einfachere Lösung bevorzugen, installieren Sie das Microsoft. Graph -Modul. Es abstrahiert einen Teil der Komplexität und ermöglicht Ihnen die Eingabe von Befehlen wie:

Install-Module Microsoft. Graph Import-Module Microsoft. Graph # Authenticate with a certificate (or app secret) $certThumbprint = "YOUR-CERT-THUMBPRINT" $AzureAppID = "YOUR-APP-ID" $TenantID = "YOUR-TENANT-ID" Connect-MgGraph -TenantId $TenantID -ClientId $AzureAppID -CertificateThumbprint $certThumbprint # Compose email $MailFrom = "[email protected]" $MailTo = "[email protected]" $MsgBody = "This is a test email with Microsoft. Graph module" $Message = @{ Subject = "Hello from Graph SDK" Body = @{ ContentType = "HTML" Content = $MsgBody } ToRecipients = @( @{ EmailAddress = @{ Address = $MailTo } } ) } # Send email Send-MgUserMail -UserId $MailFrom -Message $Message 

Diese Methode ermöglicht auch das direkte Hinzufügen von Anhängen und ist in der Regel deutlich einfacher. Hinweis: Sie funktioniert nur mit Office 365/Exchange Online – nicht mit lokalen Exchange-Servern oder anderen SMTP-Diensten. Je nach Sicherheitsrichtlinien müssen Sie möglicherweise ein Zertifikat oder einen geheimen Schlüssel zur Authentifizierung einrichten.

Letztendlich ist die Graph-API die beste Wahl, wenn Sie E-Mails zuverlässig und sicher per Skript versenden möchten, ohne lästige Warnungen oder veraltete Cmdlets. Die Einrichtung ist anfangs etwas aufwendig, aber danach läuft alles reibungslos.

Zusammenfassung

  • Richten Sie eine Azure AD-App mit Mail. Send-Berechtigungen ein.
  • Erstellen und konfigurieren Sie bei Bedarf eine Verteilergruppe.
  • Authentifizieren Sie sich mit OAuth 2.0 und erhalten Sie ein Zugriffstoken.
  • Verwenden Sie Invoke-RestMethod oder das Microsoft. Graph-Modul, um E-Mails zu versenden.
  • Rechnen Sie mit gelegentlichen Problemen, wenn Berechtigungen nicht korrekt sind oder Tokens ablaufen.

Zusammenfassung

Das Versenden moderner E-Mails mit PowerShell kann mühsam sein – insbesondere angesichts der verschärften Sicherheitsvorkehrungen von Microsoft. Ist jedoch alles korrekt konfiguriert, lässt sich der E-Mail-Versand deutlich einfacher, sicher und zuverlässig automatisieren. Erwarten Sie keine Ein-Klick-Lösung; es ist eher ein einmaliges Vorgehen, dann funktioniert es. Hoffentlich hilft dies jemandem, die Frustration über veraltete Befehle und Sicherheitsprobleme zu vermeiden. Viel Erfolg!