
Вы можете использовать встроенный 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.
Вот основные варианты:
- С сайта — это адрес отправителя. Вы можете отправить сообщение от имени любого адреса электронной почты, если 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'
Чтобы было проще редактировать атрибуты команды, команду 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, они будут отображаться некорректно.
Можно указать несколько получателей с помощью параметров:
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.
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-сервера | Порт | Тип шифрования |
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-символьный пароль).
В следующем примере показано, как отправить электронное письмо из почтового ящика 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
При использовании команды 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.
Команда Send-MailMessage использует класс .NET SmtpClient, который не поддерживает современные методы аутентификации, включая Microsoft Modern Authentication. Рекомендуется использовать Graph API для отправки сообщений электронной почты из PowerShell через Microsoft 365/Exchange Online (с помощью команды Send-MgUserMail
команды или Invoke-RestMethod
для вызова sendMail метод через REST API).