Как отправить письмо с помощью PowerShell
PowerShell - это отличный инструмент для автоматизации задач и создания отчетов или экспорта, но в какой-то момент вам захочется отправить электронное письмо с помощью PowerShell. Возможно, когда задача не удалась, или чтобы автоматически отправлять отчет по электронной почте.
Для отправки электронных писем с помощью PowerShell мы всегда могли полагаться на cmdlet send mailmessage. Но этот cmdlet теперь устарел, и Microsoft рекомендует не использовать его больше. Итак, какой сейчас лучший способ отправки электронных писем с PowerShell?
В этой статье мы рассмотрим альтернативы команде Send-MailMessage в PowerShell для отправки электронных писем.
Отправить-Сообщение Устарело
Чтобы отправить электронное письмо из PowerShell, мы всегда можем использовать командлет Send-MailMessage. Этот командлет позволяет отправлять электронные письма, включая вложения, с SMTP-сервера, который вы указываете. Проблема с командлетом Send-MailMessage в том, что он не поддерживает современные протоколы и аутентификацию.
Это означает, что вы больше не можете использовать его в комбинации с Exchange Online, например. Однако вы все еще можете использовать его с другими SMTP-серверами, которые не требуют защищенного соединения.
Отправка электронной почты с помощью устаревшего cmdlet Send-MailMessage может быть выполнена следующим образом:
$smtpServer = "smtp.mailserver.com"
$smtpPort = 587
$smtpUsername = "user@mailserver.com"
$smtpPassword = ConvertTo-SecureString -String "PassWord123" -AsPlainText -Force
$smtpCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $smtpUsername, $smtpPassword
Send-MailMessage -To "john@contoso.com" -From "powershell@a-d.site" -Subject "SMTP email" -Body "Email body with message you want to send" -SmtpServer $smtpServer -Port $smtpPort -UseSSL -Credential $smtpCredential На данный момент Microsoft не обновляет командлет Send-MailMessage. Но есть несколько альтернатив, которые мы можем использовать для отправки электронных писем. Мы сосредоточимся на 3 методах:
- Используя модуль PnPOnline
- Отправка электронных писем с помощью Microsoft Graph
- Модуль PowerShell Mailozaurr
Использование модуля PnPOnline - Send-PnPMail
Один из более простых способов отправки электронной почты с помощью PowerShell в настоящее время - использовать модуль PnPOnline. Этот модуль в первую очередь разработан для управления SharePoint Online, но он может делать больше, чем только это.
Метод Send-PnpMail использует Microsoft Graph в фоновом режиме. Когда вы устанавливаете и регистрируете модуль PnPOnline, необходимые разрешения автоматически добавляются к корпоративному приложению, которое создается в Azure. Также возможно использовать сервер Exchange Online напрямую, но в этом случае вы ограничены только внутренними электронными письмами.
Недостаток модуля Send-PnPMail заключается в том, что вы не можете добавлять вложения к своим электронным письмам. Так что имейте это в виду. Кроме того, он требует как минимум PowerShell 7, который, например, не установлен по умолчанию на Windows 2022.
Отправка email с помощью Send-PnPMail
Чтобы отправлять электронные письма с помощью командлета Send-PnPMail, сначала нужно установить модуль PnPOnline. Следуйте этому руководству о том, как установить и зарегистрировать модуль PnPOnline, а также получить информацию о подключении.
Первый шаг, прежде чем вы сможете отправлять электронные письма с помощью модуля PnPOnline, — это установить соединение. Для соединения вам нужно указать URL, это может быть просто ваш URL администратора SharePoint:
Connect-PnPOnline -url https://lazydev-admin.sharepoint.com -interactiveЧтобы просто отправить электронное письмо, вам нужно указать адрес отправителя и получателя, тему и текст письма:
Send-PnPMail -From "user@contoso.onmicrosoft.com" -To "recipient@contoso.com" -Subject "Test message" -Body "This is a test message"Электронное письмо будет сохранено в отправленных сообщениях почтового ящика, который вы указали для отправки. Этот метод будет работать для отправки электронной почты как внутренним, так и внешним получателям.
Если мы посмотрим на документацию к командлету Send-PnPMail, то тип содержания тела по умолчанию должен быть HTML. Однако во время моих тестов я заметил, что HTML не обрабатывался корректно. Только после установки параметра BodyContentType в значение true HTML стал поддерживаться:
$EmailParams = @{
From = "admin@a-d.site"
To = "meganb@a-d.site"
Subject = "Domain Controller Health Report"
BodyContentType = "HTML"
Body = $htmlTable
}
Send-PnPMail @EmailParams
В приведенном выше примере я использую распаковку (splatting) для настройки параметров команды Send-PnPMail. Это облегчает чтение и изменение параметров.
Также возможно использовать собственный SMTP-сервер и аутентифицироваться с помощью имени пользователя и пароля. Но в этом случае имеет больше смысла использовать устаревший Send-MailMessage cmdlet:
$EmailParams = @{
From = "admin@a-d.site"
To = "meganb@a-d.site"
Subject = "Test Email"
Body = "This is a test email sent using PowerShell in Office 365."
Server = "smtp.myisp.com"
Port = 587
EnableSsl = $true
Username = "lazyuser"
Password = "password123"
}
Send-PnPMail @EmailParamsОтправить письмо с помощью Microsoft Graph
Новый рекомендуемый способ отправки электронных писем с помощью PowerShell от Microsoft — это использование Microsoft Graph. PnPOnline, который мы рассматривали ранее, использует Graph в фоновом режиме. Но мы также можем напрямую использовать Microsoft Graph для отправки электронных писем.
Для этого нам нужно будет использовать командлет Send-MGUserMail. Также вам необходимо убедиться, что вы предоставили правильные разрешения, Mail-Send, приложению Microsoft Graph Enterprise в Azure. Это делается автоматически, когда вы подключаетесь к Graph с правильными областями.
Итак, первым шагом является подключение к Microsoft Graph с областью Mail-Send:
Connect-MgGraph -Scopes "Mail.Send"Если вы делаете это в первый раз, вам потребуется предоставить дополнительные разрешения для отправки почты от имени пользователя:
Отправка электронной почты с помощью Graph не так проста, как с PnPOnline или старой командлетом Send-MailMessage. Сначала нам нужно создать хэш-таблицу со всеми параметрами электронной почты и телом сообщения, которое мы хотим отправить:
$userId = "a-d@lazydev.onmicrosoft.com"
$emailParameters = @{
ToRecipients = @(
@{
EmailAddress = @{
Address = "ruud@pixelsupply.nl"
}
}
)
Subject = "Test email using MsGraph from PowerShell"
Body = @{
ContentType = "Text"
Content = "Content for the mail sent from PowerShell using Microsoft Graph."
}
}После создания хэш-таблицы мы можем отправить электронное письмо с помощью команды Send-MgUserMail. Она требует userId, который содержит адрес электронной почты, с которого мы отправляем письмо.
Send-MGUserMail -UserId $userId -Message $emailParametersДобавление вложений для отправки электронной почты MgUserMail
Проблема возникает, когда вы хотите отправить вложения с помощью командлета Send-MgUserMail. Вместо того чтобы просто указать путь к вложению или добавить объект файла, нам нужно будет определить contentBytes вложения и тип файла.
Кроме того, мы можем отправлять только вложения размером до 3 Мб. Если вы хотите отправить более крупные вложения, сначала вам нужно создать черновик письма, загрузить вложение, а затем вызвать действие отправки.
Но чтобы отправить небольшое вложение, мы можем добавить следующее в хэш-таблицу $emailParameters:
Attachments = @(
@{
"@odata.type" = "#microsoft.graph.fileAttachment"
"name" = "Example.csv"
"contentBytes" = $(
[convert]::ToBase64String((Get-Content 'C:\temp\example.csv' -AsByteStream))
)
}
)Использование Mailozaurr для отправки электронной почты в PowerShell
Mailozaurr - это сторонний модуль PowerShell, который предназначен для упрощения отправки электронной почты из PowerShell. Он поддерживает несколько методов отправки писем, включая Microsoft Graph, SMTP с oAuth2 и SendGrid API.
Чтобы отправлять электронные письма с Mailozaurr, нам все еще нужно создать безопасное соединение с сервером Exchange Online. Существует несколько способов сделать это, но одним из самых простых способов является использование корпоративного приложения Azure с разрешениями Mail.Send.
Шаг 1 - Создание корпоративного приложения Azure
Итак, первый шаг - создать приложение в Azure с правильными разрешениями. Вы также можете использовать существующее приложение для этого, но лучше использовать приложение Azure Enterprise для одной цели. Это значительно упростит управление учетными данными в дальнейшем.
- Откройте portal.azure.com и найдите или откройте Корпоративные приложения.
- Нажмите на + Новое приложение , чтобы создать новое.
- Выберите Создать собственное приложение
- Дайте приложению имя (Mailozaurr) и выберите последний вариант
- После создания приложения нажмите на Разрешения
- Нажмите на Регистрацию приложения
- Нажмите на Добавить разрешение
- Выберите Microsoft Graph -> Разрешения приложения
- Ищите Почту и выберите разрешения Mail.Send и Mail.ReadWrite.
- Нажмите на Добавить разрешение
Последний шаг состоит в том, чтобы дать согласие на разрешения, нажмите на Предоставить согласие администратора для в обзоре разрешений API.
Чтобы использовать вновь созданное приложение, нам понадобятся ID приложения, ID каталога (арендатора) и значение секрета. Первые два можно найти в обзоре приложения:
Нам нужно будет создать секрет клиента, нажмите на Сертификаты и секреты, а затем нажмите на Новый секрет клиента. Дайте секрету клиента новое название, установите дату истечения срока действия и нажмите на Создать. Запишите значение.
Шаг 2 - Создайте объект учетных данных
Теперь, когда приложение создано, мы можем продолжить в PowerShell, чтобы отправить электронное письмо. Сначала нам нужно создать объект учетных данных с идентификаторами и значением секрета, которые мы создали:
$appId = "8949e1fa-1234-4301-a006-32bdf6f09791"
$tenantId = "11e55098-1234-5467-aabb-123456789la"
$secretValue = "Tet8Q~ASDKhjln1321_asdnj0123enlazy"
$Credential = ConvertTo-GraphCredential -ClientID $appId -ClientSecret $secretValue -DirectoryID $tenantIdИмейте в виду, что любой, у кого есть доступ к скрипту, может использовать идентификаторы и секретное значение выше, чтобы отправлять электронные письма другим пользователям. Лучший вариант - использовать отпечаток сертификата для аутентификации, другой вариант - зашифровать значение ClientSecret. Таким образом, секрет клиента можно будет использовать только на одном компьютере в одной учетной записи пользователя:
$secureSecret = ConvertTo-SecureString -String $secretValue -AsPlainText -Force | ConvertFrom-SecureString
$Credential = ConvertTo-GraphCredential -ClientID $appId -ClientSecretEncrypted $secureSecret -DirectoryID $tenantIdВы можете сохранить значение $secureSecret в вашем скрипте.
Шаг 3 - Отправить письмо с Mailozaurr
Теперь у нас всё готово для отправки электронных писем в PowerShell с помощью модуля Mailozaurr. Чтобы просто отправить электронное письмо с HTML-содержимым и используя Graph-соединение, мы можем использовать следующую команду:
Send-EmailMessage -From 'meganb@a-d.site' -To 'jane@contoso.com' -Credential $Credential -HTML "test" -Subject 'This is another test email' -Graph -DoNotSaveToSentItems
Как вы можете видеть, параметр -DoNotSaveToSentItems обеспечит то, что электронное письмо не будет сохранено в отправленных письмах пользователя. Конечно, вы можете удалить это, если хотите сохранить отправленное письмо.
Добавление вложений стало гораздо проще с модулем Mailozaurr. Просто укажите путь(и) к вложениям, которые вы хотите добавить к электронному письму. Теперь вы не ограничены пределом размера файла в 4 МБ. Если вложение больше, модуль Mailozaurr позаботится об этом.
Send-EmailMessage -From 'a-d@lazydev.onmicrosoft.com' -To 'ruud@pixelsupply.nl' -Credential $Credential -HTML "test" -Subject 'This is another test email' -Graph -Attachment "C:\temp\example.csv" -ReplyTo "adelv@a-d.site" -RequestReadReceipt -RequestDeliveryReceiptЗаключение
Отправка электронных писем с помощью PowerShell стала немного сложнее по сравнению со старым командлетом Send-Mailmessage. Метод PnPOnline довольно просто реализовать и использовать. Но если вы хотите больше опций и контроля, то модуль Mailozaurr является отличным вариантом.
Тем не менее, потребуется немного усилий, чтобы правильно настроить это, но как только вы настроите разрешения и аутентификацию, это будет лучший вариант для отправки электронных писем с помощью PowerShell.
Надеюсь, вам понравится эта статья. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже.




