Легко отправляйте электронные письма с помощью командлета PowerShell Send-MailMessage

Для этой командлеты PowerShell дня мы рассмотрим командлет PowerShell Send-MailMessage. Этот командлет PowerShell служит одной и только одной цели – отправлять электронные письма различными способами.

Поскольку командлет Send-MailMessage может отправлять электронные сообщения разными способами, давайте сразу перейдем к рассмотрению всех общих примеров, с которыми вы можете столкнуться. В этой статье мы рассмотрим множество примеров, начиная с самых простых и заканчивая ситуациями, которые я никому не желаю!

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

SMTP-сервер

Все электронные письма должны проходить через SMTP-сервер с указанием сервера и порта. Чтобы указать SMTP-сервер для использования, используйте параметр с именем SMTPServer, который позволяет указать SMTP-сервер для установки соединения и пересылки почты. Однако это необязательно.

Если вы не указываете значение параметра SMTPServer, будет использовано значение, хранящееся в переменной предпочтений $PSEmailServer. Вы можете присвоить значение этой переменной так же, как и любой другой переменной.

Assigning a value to the $PSEmailServer preference variable
PS51> $PSEmailServer = 'smtp.server.local'

Однако эта переменная не сохраняется между сеансами PowerShell. Это означает, что вы должны определить её каждый раз, когда открывается новый сеанс PowerShell. По этой причине я рекомендую либо использовать её, определив её выше вашей ссылки Send-MailMessage, либо не определять её вообще. Вместо этого я бы лично предоставил значение параметра SMTPServer. Таким образом, вам не придется управлять внешней переменной, которая может измениться.

PS51> Send-MailMessage -SmtpServer 'smtp.server.local'

Port

По умолчанию значение, которое команда будет пытаться использовать для отправки электронной почты через сервер SMTP, – это порт 25. Это обычный, незашифрованный SMTP. Однако в настоящее время более распространено отправлять зашифрованные электронные письма с использованием SSL/TLS (эти сценарии мы рассмотрим позже).

Если вам нужно изменить порт с 25, вы можете использовать параметр Port.

PS51> Send-MailMessage -SmtpServer 'smtp.server.local' -Port 587

Получатели и отправители

Чтобы отправить электронное письмо различным получателям через методы, такие как To, Cc и Bcc, у команды есть различные параметры для этого.

Параметры To, Cc и Bcc в команде Send-MailMessage

У команды есть три параметра, каждый поддерживающий несколько адресатов, разделенных запятой, называемые To, Cc и Bcc.

Вы можете указать одиночные адреса, как показано ниже.

Sending email to one recipient via To, Cc and Bcc
PS51> Send-MailMessage -To joe@gmail.com -Cc bob@gmail.com -Bcc susie@hotmail.com -Subject 'this is a subject'

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

Sending email to multiple recipients via To, Cc and Bcc
PS51> Send-MailMessage -To joe@gmail.com, tony@mycompany.local -Cc bob@gmail.com, rick@othercompany.com -Bcc susie@hotmail.com,secret@fooorg.org -Subject 'this is a subject'

Параметр From

При отправке электронной почты вы также можете указать параметр From, который установит заголовок ответа в электронной почте. Этот параметр позволяет указать только один адрес. Если получатель решит ответить на электронное письмо, ответ будет отправлен на этот адрес электронной почты.

Sending email from an address
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject'

По умолчанию при использовании адреса электронной почты в поле FROM получателя просто отображается сам адрес электронной почты. Однако, если вы хотите указать имя или какой-либо другой вид метки, например, Почтовый ящик служебной учетной записи, вы также можете указать имя и адрес электронной почты:

Adam Bertram <adbertram@gmail.com>

Обратите внимание, что использован параметр Subject. Этот параметр всегда обязателен. Вы увидите, что этот параметр используется во всех примерах.

Текст письма

Параметр Body позволяет указать содержимое электронного письма. Просто можно указать любой текст, который вы хотите отправить, и командлет отправит его в виде обычного текста.

PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body'

Отправка электронных писем с HTML-текстом

Вы также можете отправить тело электронного письма в виде HTML вместо обычного текста. Для этого используйте тот же параметр Body, что и при отправке обычного текста, но для строки используйте HTML и параметр переключения BodyAsHtml.

Sending an HTML table in an email
$body = @' <table style="width:100%"> <tr> <th>Firstname</th> <th>Lastname</th> <th>Age</th> </tr> <tr> <td>Jill</td> <td>Smith</td> <td>50</td> </tr> <tr> <td>Eve</td> <td>Jackson</td> <td>94</td> </tr> </table> '@ PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body $body -BodyAsHtml

Обратите внимание на пример выше, я заключил строку тела в @' и '@. Это называется строка здесь. Это позволяет вам определять длинные строки, обычно встречающиеся в телах электронных писем, которые содержат символы возврата каретки. Строки здесь сохраняют форматирование строк и отличный способ определения тела электронной почты, особенно если оно в формате HTML.

Кодирование

Если в теме или теле вашего электронного письма есть специальные символы, вы можете использовать параметр Encoding. Этот параметр позволяет кодировать тему и тело электронного письма с помощью указанного типа кодирования перед отправкой.

У вас есть несколько вариантов:

  • ASCII (по умолчанию)
  • UTF8
  • UTF7
  • UTF32
  • Unicode
  • BigEndianUnicode
  • Default
  • OEM
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -Encoding UTF8

Вложения

Командлет также может прикреплять один или несколько файлов. Для этого вы можете использовать параметр Attachments и указать путь к файлам, которые вы хотели бы прикрепить.

Attaching the C:\file.doc to an email
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc'

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

Attaching the C:\file.doc and D:\report.xlsx file to an email
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc','D:\report.xlsx'

Параметр Attachments также позволяет передавать файлы через командлеты, такие как Get-Item и Get-ChildItem, к командлету Send-MailMessage.

PS51> Get-ChildItem -Path 'C:\MyFiles' | Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body'

Безопасная и аутентифицированная электронная почта

По умолчанию cmdlet отправляет электронную почту через незашифрованное SMTP-соединение через порт 25. Однако он также поддерживает отправку зашифрованной почты через SSL/TLS с использованием имени пользователя и пароля.

Если вы пытаетесь переслать электронную почту через SMTP-сервер, требующий аутентификации, команда завершится с сообщением об ошибке, как показано ниже.

Error message when attempting to send unencrypted email.
The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.0 Must issue a STARTTLS command first.

Чтобы исправить это, сначала необходимо указать порт (обычно 587 для TLS) и параметр UseSsl. Это указывает cmdlet’у попытаться подключиться к порту 587 на SMTP-сервере и зашифровать всё сообщение. Обычно (всегда?) также необходимо указать имя пользователя и пароль для аутентификации на SMTP-сервере, используя параметр Credential.

PS51> $credential = Get-Credential
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -UseSsl -Port 587 -Credential $credential

В приведенном выше примере я получаю объект учетных данных (PSCredential) с помощью cmdlet’а Get-Credential. Иногда это вызывает проблему, так как он использует интерактивный режим, что останавливает выполнение скрипта, чтобы запросить имя пользователя и пароль. Чтобы избежать этого, можно создать объект PSCredential на лету.

A common email example is to use Gmail. Using the knowledge you’ve gained above, you can now easily send email through Gmail using the smtp.gmail.com SMTP server as shown below.

$gmailCred = Get-Credential

$sendMailParams = @{
    From = '[email protected]' ## Должен быть gmail.com
    To = '[email protected]'
    Subject = 'some subject'
    Body = 'some body'
    SMTPServer = 'smtp.gmail.com'
    SMTPPort = 587
    UseSsl = $true
    Credential = $gmailCred
}

Send-MailMessage @sendMailParams

Назначение приоритета электронной почты

Хотя это одна из особенностей электронной почты, которую лично я хотел бы увидеть умершей, вы можете назначать уровни приоритета для отправляемых электронных писем с помощью параметра Priority. Этот приоритет затем интерпретируется по-разному клиентом электронной почты.

High priority message in Outlook

Send-mailmessage позволяет назначить электронному письму три разных приоритета.

  • Нормальный (по умолчанию)
  • Высокий
  • Низкий
Assigning a high-priority email
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -Priority High

Но, ради всего святого, не думайте, что все ваши электронные письма имеют высокий приоритет!

Уведомления о доставке

Наконец, вы можете указать уведомления о доставке для электронных писем. Уведомления о доставке, как правило, известны как уведомления о прочтении в некоторых почтовых клиентах. Уведомления о доставке позволяют получать уведомление о том, что письмо получено получателем. Однако получатель все равно должен разрешить это.

У вас есть четыре варианта при запросе уведомлений о доставке.

  • Нет (по умолчанию)
  • OnSuccess (когда доставка письма прошла успешно)
  • OnFailure (уведомить, если доставка не удалась)
  • Delay (когда письмо задерживается на SMTP-сервере)

Вы можете указать вариант уведомления о доставке с помощью параметра DeliveryNotificationOptions.

Requesting a notification on delivery
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess'

Вы также можете запросить несколько уведомлений о доставке одновременно, разделяя их запятой.

Requesting a notification for all types
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess','OnFailure','Delay'

Вывод

В этой статье вы узнали все о командлете Send-mailmessage и о том, что он может делать. Мы подробно рассмотрели этот командлет, используя все его параметры вместе с примерами. Надеюсь, эта статья может служить вам справочным материалом при использовании командлета Send-mailmessage.

Дополнительное чтение

Обязательно ознакомьтесь с другими связанными статьями!

Source:
https://adamtheautomator.com/send-mailmessage/