Send-MailMessage: Отправка электронных сообщений с помощью PowerShell

Вы можете использовать встроенный Send-MailMessage Команда для отправки SMTP-сообщений из PowerShell (ранее можно было использовать .Net System.Net.Mail класс для отправки электронных сообщений). Send-MailMessage позволяет отправлять сообщения с вложениями, использовать формат HTML для тела сообщения, включать уведомление о доставке, отправлять сообщение сразу нескольким получателям и т. д. В этой статье мы рассмотрим, как использовать Send-MailMessage для отправки сообщений электронной почты из сценариев PowerShell.

 

PowerShell Send-MailMessage Cmdlet: Параметры и примеры

Чтобы узнать синтаксис команды, выполните эту команду:

get-help Send-MailMessage

Send-MailMessage [-To] <String[]> [-Subject] <String> [[-Body] <String>] [[-SmtpServer] <String>] [-Attachments <String[]>] [-Bcc <String[]>] [-BodyAsHtml] [-Cc <String[]>] [-Credential <PSCredential>] [-DeliveryNotificationOption {None | OnSuccess | OnFailure | Delay | Never}] [-Encoding <Encoding>] -From <String> [-Port <Int32>] [-Priority {Normal | Low | High}] [-UseSsl] [<CommonParameters>]
The Send-MailMessage cmdlet sends an email message from within Windows PowerShell.

Использование команды PowerShell Send-MailMessageИспользование команды PowerShell Send-MailMessage

Вот основные варианты:

  • С сайта — это адрес отправителя. Вы можете отправить сообщение от имени любого адреса электронной почты, если SMTP-сервер не проверяет адрес отправителя (анонимная ретрансляция);
  • На — адрес электронной почты получателя;
  • SMTPServer -адрес SMTP-сервера, через который вы хотите отправить электронное письмо.

Адрес SMTP-сервера не требуется, если вы задали адрес почтового сервера в переменной среды $PSEmailServer:

$PSEmailServer = "smtp.woshub.com"

Следующая команда PowerShell отправит электронное письмо с указанными темой и телом нескольким получателям.

Send-MailMessage -From '[email protected]' -To '[email protected]','[email protected]' -Subject "Test Email Alert" -Body "This is email body text" –SmtpServer 'smtp.woshub.com'

Вы можете отправить электронное письмо одному или нескольким почтовым ящикам получателей, на канал Teams или на адрес в группе распределения Exchange.

Чтобы было проще редактировать атрибуты команды, команду Send-MailMessage можно представить следующим образом:

Send-MailMessage `
-SmtpServer smtp.woshub.com `
-To '[email protected]','[email protected]' `
-From '[email protected]' `
-Subject "Test" `
-Body "Sending email using PowerShell" `
-Encoding 'UTF8'

Обратите внимание, что в последней команде мы дополнительно установили параметр UTF8 кодировку для сообщения электронной почты. В противном случае, если тема или тело письма содержат символы, не относящиеся к кодировке ANSI, они будут отображаться некорректно.

В Windows PowerShell по умолчанию используется кодировка ANSI и ASCII. Если вы обновили версию PS до PowerShell Core, имейте в виду, что эта версия уже использует кодировку UTF-8 по умолчанию.

Можно указать несколько получателей с помощью параметров:

  • To — адреса электронной почты обычных получателей;
  • Cc — адреса электронной почты для отправки углеродной копии (CC) сообщения;
  • Bcc — адреса электронной почты, которые получат копию сообщения, но не будут указаны в качестве получателя сообщения.

Включить уведомление о доставке сообщения электронной почты можно с помощью -DeliveryNotificationOptions (позволяет получать уведомления о получении адресатом письма). Доступны следующие типы уведомлений:

  • OnSuccess (Уведомление об успешной доставке)
  • OnFailure (Уведомление в случае неудачной доставки)
  • Задержка (Уведомление о задержке доставки)

В одной команде можно указать несколько параметров:

Send-MailMessage … -DeliveryNotificationsOptions 'OnSuccess', 'OnFailure'

Уведомление о доставке будет отправлено на почтовый ящик, указанный в поле «От».

Вы также можете установить приоритет почтового сообщения (не отображается в некоторых клиентах):

-Priority High|Low|Normal

Если вы хотите добавить вложение в письмо, воспользуйтесь функцией -Attachments опция. В приведенном ниже примере мы отправим письмо в формате HTML (-BodyAsHtml) и прикрепить file1.txt и report.xsls с локального диска.

$MailMessage = @{
To = "[email protected]"
Bcc = "[email protected]", "[email protected]"
From = "DC server <[email protected]>"
Subject = "DC Server Report"
Body = "<h1>Welcome!</h1> <p><strong>Generated:</strong> $(Get-Date -Format g)</p>”
Smtpserver = "smtp.gmail.com"
Port = 587
UseSsl = $true
BodyAsHtml = $true
Encoding = “UTF8”
Attachment = “C:\Logs\file1.txt”, “C:\Logs\report.xlsx”
}
Send-MailMessage @MailMessage -Credential $cred

В этом примере мы также заменили отображаемое имя получателя на «сервер DC».

Вот как выглядит HTML-письмо с вложениями в интерфейсе Gmail.

тестовое письмо с вложением, созданное с помощью PowerShell в интерфейсе Gmailтестовое письмо с вложением, созданное с помощью PowerShell в интерфейсе Gmail

Когда вы отправляете электронное письмо от имени общего почтового ящика Exchange/Microsoft 365, для которого вам были предоставлены права SendAs разрешения, вы можете указать, что копия сообщения должна быть сохранена в папке «Отправленные» исходного почтового ящика. Для этого включите параметр MessageCopyForSentAsEnabled . параметр для почтового ящика:Set-Mailbox it_dept -MessageCopyForSentAsEnabled $True

Использование Send-MailMessage с SMTP Auth и TLS/SSL

По умолчанию команда Send-MailMessage отправляет электронное письмо через незашифрованный SMTP-порт TCP 25. Если ваш SMTP-сервер позволяет отправлять электронную почту только по зашифрованному протоколу, вы можете указать номер порта в поле -Port (чаще всего это 465 или 587) и атрибут —UseSsl вариант:

-SmtpServer 'smtp.woshub.com' -Port 465 –UseSsl

Возникнет ошибка, если SSL-сертификат SMTP-сервера не соответствует FQDN, указанному в HELO:

Send-MailMessage: The remote certificate is invalid according to the validation procedure.

Вы также можете получить ошибку при отправке сообщения электронной почты с использованием SSL/TLS-шифрования:

Send-MailMessage : Unable to read data from the transport connection: net_io_connectionclosed

В этом случае рекомендуется проверить следующее

  • Что указанный SMTP-порт открыт и доступен с вашего компьютера: Test-NetConnection smtp.woshub.com –Port 465
  • Попробуйте использовать другой SMTP-порт. Например, 587 (msa) вместо 465 (smtps). Порт 587 используется по умолчанию при использовании расширения STARTTLS;
  • Если вы используете более старую операционную систему (Windows Server 2012/Windows 8 и ниже), необходимо включить поддержку протокола TLS 1.2 для PowerShell с помощью команды:
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
В таблице ниже перечислены настройки SMTP-сервера для популярных публичных поставщиков электронной почты, которые можно использовать для отправки сообщений из PowerShell (обратите внимание, что вы должны разрешить отправку электронной почты по SMTP в интерфейсе учетной записи):

Имя Адрес SMTP-сервера Порт Тип шифрования
Gmail smtp.gmail.com 58725

465

TLSTLS

SSL

Microsoft (Office) 365 smtp.office365.com 587 TLS
Outlook.com smtp-mail.outlook.com 587 TLS
Yahoo smtp.mail.yahoo.com 587 TLS
Почта iCloud smtp.mail.me.com 587 TLS
AOL smtp.aol.com 465 SSL

Если SMTP-сервер не разрешает анонимную почту (ретрансляция запрещена), вы увидите эту ошибку:

5.7.1 Client was not authenticated.

или:

The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM.

Затем вы можете аутентифицироваться на SMTP-сервере, используя -Credential опция.

Вы можете интерактивно запросить учетные данные пользователя для аутентификации:

Send-MailMessage …… -Credential (Get-Credential)

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

$cred = Get-Credential
Send-MailMessage ... -Credential $cred

Как отправить электронное письмо через Gmail SMTP с помощью PowerShell?

Чтобы отправить электронное письмо с почтового ящика на одной из публичных почтовых служб, рекомендуется использовать Пароль приложения вместо пароля для доступа к учетной записи/почтовому ящику. Например, в Gmail вы можете создать пароль приложения после того, как включите двухфакторную аутентификацию для своего аккаунта Google. Создайте и скопируйте пароль приложения в Google (это 16-символьный пароль).

создание пароля приложения smtp в gmailсгенерировать пароль smtp приложения в gmail

В следующем примере показано, как отправить электронное письмо из почтового ящика Google с помощью PowerShell. Вместо пароля учетной записи Google необходимо использовать пароль приложения. В этом примере мы укажем пароль приложения для подключения к SMTP-серверу Gmail непосредственно в коде сценария PowerShell.

$From = "[email protected]"
$To = "[email protected]"
$Subject = "Test PowerShell email from $($env:computername)"
$Body = "some message test "
$Password = "your_google_app_password" | ConvertTo-SecureString -AsPlainText -Force
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $From, $Password
Send-MailMessage -From $From -To $To -Subject $Subject -Body $Body -SmtpServer "smtp.gmail.com" -port 587 -UseSsl -Credential $Credential

Обратите внимание, что PowerShell сохраняет команду с паролем в виде простого текста в файле истории команд PowerShell.

При использовании команды 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 устарелаpowershell команда send-mailmessage устарела

Команда Send-MailMessage использует класс .NET SmtpClient, который не поддерживает современные методы аутентификации, включая Microsoft Modern Authentication. Рекомендуется использовать Graph API для отправки сообщений электронной почты из PowerShell через Microsoft 365/Exchange Online (с помощью команды Send-MgUserMail команды или Invoke-RestMethod для вызова sendMail метод через REST API).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *