Для отправки писем через 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>]
Основные параметры:
- From – адрес отправителя (не обязательно указывать реально существующий адрес. Если SMTP сервер не проверяет адрес отправителя, то можно отправить письмо от имени любого email адреса);
- To – email адрес получателя;
- SMTPServer – адрес SMTP сервера , через который нужно выполнить отправку письма
Следующая простейшая команда 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. Иначе, если тема или текст письма будут содержать русские буквы, то они будут отображены знаками вопроса.
По умолчанию командлет Send-MailMessage пытается выполнить отправку письма через стандартный SMTP порт TCP 25. Если ваш smtp сервер позволяет отправить письмо только по шифрованному протоколу, можно указать номер порта (чаще всего это 465 или 587) и опцию UseSsl:
-SmtpServer 'smtp.winitpro.ru' -Port 465 –UseSsl
Название | Адрес SMTP сервера | Порт | Тип шифрования |
Yandex | smtp.yandex.ru | 465 | TLS/SSL |
Mail.ru | smtp.mail.ru | 465 | TLS/SSL |
Gmail | smtp.gmail.com | 587 25 465 | TLS TLS SSL |
Office 365 | smtp.office365.com | 587 | TLS |
Outlook.com | smtp-mail.outlook.com | 587 | TLS |
Если SMTP сервер запрещает анонимную отправку (запрещен relay), то при попытке отправить письмо вы получите ошибку:
5.7.1 Client was not authenticated
.
В этом случае вы можете аутентифицироваться на SMTP сервере с помощью параметра –Credential.
Можно запросить данные пользователядля аутентификации интерактивно:
Send-MailMessage …… -Credential (Get-Credential)
Можно указать учетную запись для авторизации через переменную:
$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 (оповестить, если доставка отложена).
А так не проще? И без VBS
Send-MailMessage -From user@domain -To user_@domain_ -SmtpServer server_name(/ip) -Subject «Subject» -Body «text»;
А как файл *.eml преобразовать в почтовое сообщение с помощью powershell ? Или чем еще?
Впрямую преобразовать eml в текст — даже не знаю как. Если только открыть его как текстовый файл и распарсить по полям. Или какой-то вариант отправки файла через Outlook скриптом powershell. Но готового к сожалению нет.
Не проще ли вложением отправлять или сохранить его в виде html, получить содержимое через get-content и отправить через Send-MailMessage как в статье?
У нас контора странная: через шлюз почтовые сообщения можно только файлами. Поэтому думаю над таким вариантом: поставить SMTP сервер, смотрящий в «никуда». В исходящей очереди у него, по-моему, копятся eml файлы. Их и отправлять через шлюз. Спасибо за варианты!
В другой Вашей статье (про SMTP-сервер) прочитал, что файл можно положить в папку Pickup.
Попробовал файл .eml (из папки очереди) из одного SMTP сервера положить в папку Pickup другого SMTP-сервера (с другой стороны шлюза). Сработало, тот сервер отправил файл, пришло письмо, русские символы нормальные!
ну да, решение довольно странное, а архитектура похожа на происки безопасников в погонах … 🙂