Senden Sie E-Mails mit Microsoft Graph API und PowerShell

Admin

Um E-Mails über einen SMTP-Server aus PowerShell-Skripten zu senden, können Sie die integrierte Funktion verwenden Send-MailMessage-Cmdlet. Der größte Nachteil besteht darin, dass es nur die einfache SMTP-Authentifizierung verwenden kann und keine modernen Authentifizierungsmethoden, einschließlich OAuth und, unterstützt Moderne Microsoft-Authentifizierung. Wenn Sie den Befehl Send-MailMessage ausführen neue Versionen des PowerShell Core 7.x, erhalten Sie die folgende Warnung:

WARNING: The command 'Send-MailMessage' is obsolete. This cmdlet does not guarantee secure connections to SMTP servers. While there is no immediate replacement available in PowerShell, we recommend you do not use Send-MailMessage at this time. See https://aka.ms/SendMailMessage for more information.
PowerShell Send-MailMessage ist veraltet

Standardmäßig deaktiviert Microsoft Basic Auth für alle neuen Azure-Mandanten. In diesem Beitrag sehen wir uns an, wie Sie E-Mails von Ihrem Exchange Online-/Microsoft 365-Mandanten mithilfe der Microsoft Graph-API und PowerShell senden.

Inhalt:

  • Konfigurieren Sie Berechtigungen zum Senden von E-Mails mit der Microsoft Graph-API
  • Senden von E-Mails über Exchange Online mit Invoke-RestMethod
  • Verwendung des Send-MgUserMail-Cmdlets von Microsoft. Diagrammmodul

Konfigurieren Sie Berechtigungen zum Senden von E-Mails mit der Microsoft Graph-API

Bevor Sie ein Azure-Token erhalten und sich über Ihr PowerShell-Skript authentifizieren können, müssen Sie eine neue Anwendung im Entra ID-Mandanten erstellen (Azure Active Directory -> App-Registrierung -> Neue Registrierung). Dann gewähren Mail.Send Berechtigung für die Anwendung (API-Berechtigungen -> Berechtigung hinzufügen -> Microsoft Graph -> Anwendungsberechtigungen -> Mail. Schicken).

Entra ID (Azure) API-Berechtigungen Mail. Schicken
Erfahren Sie im Beitrag „, wie Sie eine Azure-App für Microsoft Graph registrieren“Herstellen einer Verbindung zur Microsoft Graph-API mithilfe von PowerShell’.

Standardmäßig kann Ihre Anwendung Senden Sie eine E-Mail im Namen eines beliebigen Postfachs im Exchange Online-Mandanten. Sie können die Anwendungszugriffsrichtlinie verwenden, um die Liste der E-Mail-Adressen einzuschränken, in deren Namen Ihre Anwendung E-Mails senden kann.

Stellen Sie über PowerShell eine Verbindung zu Exchange Online her (Connect-ExchangeOnline), Erstelle ein Exchange-Verteilergruppeund fügen Sie die Konten hinzu, von denen Sie E-Mails senden möchten:

New-DistributionGroup -Name "azappSendasAllowed" -Type "Security" -Members @("[email protected]")

Du kannst auch Verstecken Sie die Gruppe aus der Exchange Global Address List (GAL). wenn Sie wünschen:

Set-DistributionGroup -Identity azappSendasAllowed -HiddenFromAddressListsEnabled $true

Erstellen Sie nun eine Richtlinie und binden Sie sie an Ihre Azure AppID:

New-ApplicationAccessPolicy -AppId "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -PolicyScopeGroupId azappSendasAllowed -AccessRight RestrictAccess -Description "Resrtict SendAs Policy"

New-ApplicationAccessPolicy – ​​Senden von E-Mails zulassen

Sie können nun prüfen, an welche Adressen Ihre Bewerbung E-Mails im Namen senden darf:

Test-ApplicationAccessPolicy -Identity [email protected] -AppId "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Test-ApplicationAccessPolicy -Identity [email protected] -AppId "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Abhängig vom Zugriffsstatus wird der obige Befehl zurückgegeben Bestritten oder Gewährt.

Test-ApplicationAccessPolicy

Senden von E-Mails über Exchange Online mit Invoke-RestMethod

Du kannst den... benutzen sendMail REST-API-Methode zum Senden einer E-Mail über Exchange Online/Microsoft 365. Um die Methode aufzurufen, verwenden Sie die integrierte Invoke-RestMethod PowerShell-Cmdlet.

Um eine E-Mail über die Microsoft Graph-API zu senden, müssen Sie sich mit der Entra-ID (Azure) authentifizieren und ein Token erhalten.

$AccessSecret= "3333333333333333333333333333333333333333333"
$AzureAppID = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
$tenantID="1234567-1234-1234-1234-123456789012"

Stellen Sie nun eine Verbindung zur Graph-API her und führen Sie eine Authentifizierung durch:

$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"
}

Sie können jetzt eine E-Mail senden:

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

Überprüfen Sie, ob die E-Mail erfolgreich an das Exchange-Postfach des Benutzers zugestellt wurde.

Senden Sie E-Mails mit PowerShell und der Microsoft Graph-API

Verwendung des Send-MgUserMail-Cmdlets von Microsoft. Diagrammmodul

Wenn Sie das Cmdlet Invoke-RestMethod zum Senden einer E-Mail verwenden, müssen Sie das gesamte E-Mail-Objekt im JSON-Format generieren. Um den Vorgang zu vereinfachen, können Sie es mit dem versuchen Send-MgUserMail Cmdlet von Microsoft. Stattdessen das Graph-Modul.

Installiere das Microsoft. Graph Modul und importieren Sie es in Ihre PowerShell-Sitzung:

Install-Module Microsoft.Graph
Import-Module Microsoft.Graph

Wir werden a verwenden Zertifikat zur Authentifizierung in Microsoft 365 (Exchange Online) Mieter:

$certThumbprint = "9CF05589A4B29BECEE6456F08A76EBC3DC2BC581"
$AzureAppID = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
$tenant="woshub.onmicrosoft.com"
Connect-MgGraph -TenantId $Tenant -ClientId $AzureAppID -CertificateThumbprint $certThumbprint. 

Als nächstes erstellen wir eine einfache E-Mail mit einem HTML-Text und einer angehängten Datei:

$MailFrom = "[email protected]"
$MailTo = "[email protected]"
$msgBody = “This is 
test
Graph API mailer
” $Attachment = "C:\logs\mytestapp.log" $AttachmentContentBytes = [System.IO.File]::ReadAllBytes($Attachment) $AttachmentBase64 = [System.Convert]::ToBase64String($AttachmentContentBytes) $Message = @{ Subject = "Hello World from GraphAPI" Body = @{ ContentType = "HTML" Content = $msgBody } ToRecipients = @( @{ EmailAddress = @{ Address = $MailTo } } ) Attachments = @( @{ "@odata.type" = "#microsoft.graph.fileAttachment" Name = (Split-Path $Attachment -Leaf) ContentType = "application/octet-stream" ContentBytes = $AttachmentBase64 } ) }
Send-MgUserMail: E-Mail mit der Microsoft Graph-API senden

Mit diesem Befehl können Sie eine E-Mail-Nachricht senden:

Send-MgUserMail -UserId $MailFrom -Message $Message

Das Cmdlet Send-MgUserMail kann nur zum Senden von E-Mails über Exchange Online verwendet werden. Dies bedeutet, dass es nicht mit dem lokalen Exchange Server oder anderen E-Mail-/SMTP-Anbietern funktioniert.

Verwalten Sie Windows-Updates mit dem PSWindowsUpdate PowerShell-Modul
Verwalten Sie Windows-Updates mit dem PSWindowsUpdate PowerShell-Modul

Du kannst den... benutzen PSWindowsUpdate PowerShell-Modul zum Verwalten von Windows-Updates über...

Aktualisieren der PowerShell-Version unter Windows
Aktualisieren der PowerShell-Version unter Windows

In diesem Artikel wird beschrieben, wie Sie ein Update durchführen Windows PowerShell auf die neu...

Verwalten von Druckern und Treibern mit PowerShell in Windows 10 / Server 2016
Verwalten von Druckern und Treibern mit PowerShell in Windows 10 / Server 2016

Im Vorheriger Artikelhaben wir uns die VBS-Skripte der alten Schule angesehen, mit denen sich Dru...