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.
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).
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]")
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"
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.
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.
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 } ) }
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.