Send-MailMessage: отправка почты из PowerShell

Для отправки писем через smtp сервер в PowerSHell можно использовать командлет Send-MailMessage. Данный встроенный командлет доступен для отправки почтовых email сообщений в PowerShell начиная с версии 2.0 (командлет применяется вместо класса .Net System.Net.Mail). В этой статье мы рассмотрим, как использовать Send-MailMessage для отправки писем из скриптов PowerShell.

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

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>]

командлет Send-MailMessage отправки почты из powershell

Основные параметры:

  • From – адрес отправителя (не обязательно указывать реально существующий адрес. Если SMTP сервер не проверяет адрес отправителя, то можно отправить письмо от имени любого email адреса);
  • To – email адрес получателя;
  • SMTPServer – адрес SMTP сервера , через который нужно выполнить отправку письма
Адрес SMTP сервера для отправки email указывать не обязательно, если вы задали адрес почтового сервера в переменной окружения $PSEmailServer.

Следующая простейшая команда PowerShell отправит письмо с указанной темой (Subject) и содержимым (Body) нескольким получателям.

Send-MailMessage -From 'server@winitpro.ru' -To 'admin@winitpro.ru','manager@winitpro.ru' -Subject "Alert from Server1" -Body "It is email body" –SmtpServer 'smtp.winitpro.ru'

Для удобства редактирования эту команду отправки можно представить так:

Send-MailMessage `
-SmtpServer smtp.winitpro.ru `
-To 'admin@winitpro.ru','manager@winitpro.ru' `
-From 'server@winitpro.ru' `
-Subject "test" `
-Body "Тема письма на русском" `
-Encoding 'UTF8'

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

отправка тестового письма из powershell русская кодировка

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

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

-SmtpServer 'smtp.winitpro.ru' -Port 465 –UseSsl

В следующей таблице перечислены параметры SMTP серверов популярных публичных email провайдеров, которые вы можете использовать для отправки почты из PowerShell (обратите внимание, что у большинства из них нужно дополнительно разрешить отправку писем через SMTP из интерфейса аккаунта):

НазваниеАдрес SMTP сервераПортТип шифрования
Yandexsmtp.yandex.ru465TLS/SSL
Mail.rusmtp.mail.ru465TLS/SSL
Gmailsmtp.gmail.com587

25

465

TLS

TLS

SSL

Office 365smtp.office365.com587TLS
Outlook.comsmtp-mail.outlook.com587TLS

Если SMTP сервер запрещает анонимную отправку (запрещен relay), то при попытке отправить письмо вы получите ошибку: 5.7.1 Client was not authenticated.

В этом случае вы можете аутентифицироваться на SMTP сервере с помощью параметра –Credential.

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

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

powershell Send-MailMessage отправка почты с аутентфикацией

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

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

Если же вам нужно сохранить пароль для подключения к smtp серверу непосредственно в коде скрипта PowerShell, используйте такую конструкцию:

$mypasswd = ConvertTo-SecureString "$trongPass1" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ("username", $mypasswd)
Send-MailMessage ... –Credential $mycreds

Если нужно добавить в письмо вложение, используйте параметр –Attachments. В следующем примере мы отправим письмо в формате HTML и прикрепим к письму файлы report1.txt и report2.txt с локального диска:

$MailMessage = @{
To = "admin@winitpro.ru
Bcc = "manager@winitpro.ru", "manager2@winitpro.ru"
From = "DC server <server@winitpro.ru>"
Subject = "Отчет с сервера DC"
Body = "<h1>Добро пожаловать!</h1> <p><strong>Сформировано:</strong> $(Get-Date -Format g)</p>”
Smtpserver = "smtp.winitpro.ru"
Port = 25
UseSsl = $false
BodyAsHtml = $true
Encoding = “UTF8”
Attachment = “C:\ps\report1.txt”, “C:\ps\report2.txt”
}
Send-MailMessage @MailMessage -Credential $cred

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

Можно настроить для письма уведомление о доставке с помощью параметра

-DeliveryNotificationOption. Возможные значения:

  • OnSuccess (отчет при удачной доставке);
  • OnFailure (отчет если доставка не выполнена);
  • Delay (оповестить, если доставка отложена).

Предыдущая статья Следующая статья


Комментариев: 6 Оставить комментарий

Оставить комментарий

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

Я не робот( Обязательно отметьте)