Поиск по сайту:

Как отправить письмо с помощью 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 для одной цели. Это значительно упростит управление учетными данными в дальнейшем.

  1. Откройте portal.azure.com и найдите или откройте Корпоративные приложения.
  2. Нажмите на + Новое приложение , чтобы создать новое.
  3. Выберите Создать собственное приложение
  4. Дайте приложению имя (Mailozaurr) и выберите последний вариант

  1. После создания приложения нажмите на Разрешения
  2. Нажмите на Регистрацию приложения

  1. Нажмите на Добавить разрешение
  2. Выберите Microsoft Graph -> Разрешения приложения
  3. Ищите Почту и выберите разрешения Mail.Send и Mail.ReadWrite.
  4. Нажмите на Добавить разрешение

Последний шаг состоит в том, чтобы дать согласие на разрешения, нажмите на Предоставить согласие администратора для в обзоре разрешений 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.

Надеюсь, вам понравится эта статья. Если у вас есть какие-либо вопросы, просто оставьте комментарий ниже.