Отправляйте электронные письма с помощью Microsoft Graph API и PowerShell

Admin

Чтобы отправить электронную почту через SMTP-сервер из сценариев PowerShell, вы можете использовать встроенный Командлет Send-MailMessage. Его основным недостатком является то, что он может использовать только базовую аутентификацию SMTP и не поддерживает современные методы аутентификации, включая OAuth и Современная аутентификация Microsoft. Когда вы запускаете команду Send-MailMessage в новые версии PowerShell Core 7.x, вы получите следующее предупреждение:

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 устарел

По умолчанию Microsoft отключает базовую проверку подлинности для всех новых клиентов Azure. В этом посте мы рассмотрим, как отправлять электронную почту из вашего клиента Exchange Online/Microsoft 365 с помощью API Microsoft Graph и PowerShell.

Содержание:

  • Настройка разрешений на отправку электронной почты с помощью Microsoft Graph API
  • Отправка электронной почты через Exchange Online с использованием Invoke-RestMethod
  • Использование командлета Send-MgUserMail от Microsoft. Графический модуль

Настройка разрешений на отправку электронной почты с помощью Microsoft Graph API

Прежде чем вы сможете получить токен Azure и пройти аутентификацию с помощью сценария PowerShell, вам необходимо создать новое приложение в клиенте Entra ID (Azure Active Directory -> Регистрация приложения -> Новая регистрация). Тогда предоставьте Mail.Send разрешение для приложения (Разрешения API -> Добавить разрешение -> Microsoft Graph -> Разрешения приложения -> Mail. Отправлять).

Разрешения API Entra ID (Azure) Почта. Отправлять
Узнайте, как зарегистрировать приложение Azure для Microsoft Graph, в статье «Подключение к API Microsoft Graph с помощью PowerShell’.

По умолчанию ваше приложение может отправить электронное письмо от имени любого почтового ящика в клиенте Exchange Online. Вы можете использовать политику доступа к приложению, чтобы ограничить список адресов электронной почты, от имени которых ваше приложение может отправлять электронные письма.

Подключитесь к Exchange Online с помощью PowerShell. (Connect-ExchangeOnline), создать Группа рассылки Exchangeи добавьте учетные записи, с которых вы хотите иметь возможность отправлять электронную почту:

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

Вы также можете скрыть группу из глобального списка адресов Exchange (GAL) если вы хотите:

Set-DistributionGroup -Identity azappSendasAllowed -HiddenFromAddressListsEnabled $true

Теперь создайте политику и привяжите ее к своему Azure AppID:

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

New-ApplicationAccessPolicy — разрешить отправку электронной почты

Теперь вы можете проверить, на какие адреса вашему приложению разрешено отправлять электронную почту от имени:

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

В зависимости от статуса доступа приведенная выше команда вернет Отклонен или Предоставленный.

Test-ApplicationAccessPolicy

Отправка электронной почты через Exchange Online с использованием Invoke-RestMethod

Вы можете использовать Отправить письмо Метод REST API для отправки электронной почты через Exchange Online/Microsoft 365. Для вызова метода используйте встроенный Invoke-RestMethod Командлет PowerShell.

Чтобы отправить электронное письмо с помощью API Microsoft Graph, вы должны пройти аутентификацию с помощью Entra ID (Azure) и получить токен.

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

Теперь подключитесь к API Graph и выполните аутентификацию:

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

Теперь вы готовы отправить электронное письмо:

$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.

Убедитесь, что электронное письмо было успешно доставлено в почтовый ящик Exchange пользователя.

Отправка электронной почты с помощью PowerShell и Microsoft Graph API

Использование командлета Send-MgUserMail от Microsoft. Графический модуль

Использование командлета Invoke-RestMethod для отправки электронного письма означает, что вам необходимо сгенерировать весь объект электронной почты в формате JSON. Чтобы упростить процесс, вы можете попробовать использовать Отправить-MgUserMail командлет от Microsoft. Вместо этого модуль Graph.

Установите Майкрософт. График модуль и импортируйте его в сеанс PowerShell:

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

Мы будем использовать сертификат для аутентификации в Microsoft 365 (Exchange Online) жилец:

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

Далее мы создаем простое электронное письмо с телом HTML и прикрепленным файлом:

$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: отправка электронной почты с помощью API Microsoft Graph

Вы можете использовать эту команду для отправки сообщения электронной почты:

Send-MgUserMail -UserId $MailFrom -Message $Message

Командлет Send-MgUserMail можно использовать только для отправки электронных писем через Exchange Online. Это означает, что он не будет работать с локальным сервером Exchange или другими поставщиками электронной почты/SMTP.

Безопасное шифрование пароля (учетных данных) в сценариях PowerShell
Безопасное шифрование пароля (учетных данных) в сценариях PowerShell

Администраторам часто приходится хранить пароли в сценариях автоматизации непосредственно в теле ...

Как получить мой общедоступный IP-адрес с помощью PowerShell
Как получить мой общедоступный IP-адрес с помощью PowerShell

Привет, админ! В одном из моих сценариев PowerShell мне нужно было определить текущий внешний IP-...

Управление дисками и разделами с помощью Windows PowerShell
Управление дисками и разделами с помощью Windows PowerShell

В этой статье мы рассмотрим управление дисками, разделами и томами из консоли PowerShell. Вы може...