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.

PowerShell-Remoting über WinRM für Benutzer ohne Administratorrechte
PowerShell-Remoting über WinRM für Benutzer ohne Administratorrechte

Um über PowerShell (PowerShell Remoting) eine Verbindung zu einem Remotecomputer herzustellen, be...

Wie misst man Speicherleistung und IOPS unter Windows?
Wie misst man Speicherleistung und IOPS unter Windows?

Eine der Hauptmetriken, die es ermöglicht, die Leistung des vorhandenen oder entworfenen Speicher...

Führen Sie MySQL-Abfragen über PowerShell aus
Führen Sie MySQL-Abfragen über PowerShell aus

Eine der nützlichen PowerShell-Funktionen ist die Möglichkeit, eine Verbindung zu Datenbanken auf...