- Как отправлять письма используя Powershell Send-MailMessage
- Настройка SMTP сервера
- Аутентификация
- Отправка писем
- Несколько адресатов
- Кодировка
- Отправка письма с разметкой HTML
- Вложения
- Уведомления о доставке
- Приоритет
- Установка и настройка SMTP сервера на Windows Server 2016 / 2012 R2
- Установка службы SMTP на Windows Server 2016/2012 R2
- Настройка SMTP сервера на Windows Server
- Автозапуск службы SMTPSVC
- Проверка работы SMTP сервера на Windows Server
Как отправлять письма используя Powershell Send-MailMessage
Для отправки писем в Powershell есть команда Send-MailMessage. С помощью этой команды мы можем выполнять отправку писем используя вложения, HTML формат и множеству получателей. У этой команды есть ряд особенностей, которые мы рассмотрим ниже на примерах.
Навигация по посту
Настройка SMTP сервера
Что бы вы смогли отправить письмо вы должны знать настройки для вашего сервера. Почтовые сервера, для отправки писем, используют протокол SMTP. Когда сервера SMTP общаются друг с другом они используют 25 порт, а клиент с сервером 465 или 587 порт. Кроме этого вы должны знать по какому адресу отвечает сервер и использует ли он шифрование. Обычно, если вы используете публичного провайдера, эти настройки доступны в документации.
Ниже пример настроек для яндекса:
Адрес сервера, в Powershel, можно указать двумя способами. Можно объявить используя специальную встроенную переменную $PSEmailServer:
Такая переменная будет работать в рамках одной сессии Powershell (до закрытия консоли) и нам не нужно будет указывать ее в каждой команде. Например так:
Отмечу, что в случае яндекса и gmail знать логин/пароль и почтовый сервер не достаточно. В случае этих провайдеров, в их веб интерфейсах, понадобится настраивать специфические разрешения. В случае обычных, локальных серверов, этого обычно не требуется.
Порт сервера устанавливается в дополнительном параметре Port. Если он не указан, то будет использоваться порт по умолчанию — 25:
Аутентификация
Что бы мы могли отправить письмо — мы должны предоставить пару логин и пароль. Это можно сделать с помощью команды ‘Get-Credential’:
Как видно на скриншоте — при каждом выполнении команды у нас появляется окно для ввода логина и пароля. Вы так же можете сохранить учетные данные в переменную и передавать ее в команды:
При работе с командой Get-Credential есть неочевидная деталь — ее запуск создает объект (логин и пароль) в памяти. Любая попытка его экспортировать (сохранить) приведет к шифрованию объекта ключем, индивидуальным для каждого пользователя. Т.е. это плохой вариант, если вы планируете отправлять письма со множества компьютеров — вам просто понадобится вводить эти данные у каждого пользователя.
Вы можете передать пароль обычным текстом, что решит проблему описанную выше:
Более подробно, про работу логинов и паролей в Powershell, описывалось в предыдущих статьях.
Как подставлять значения переменных в строках с Powershell
Отправка писем
Разобравшись с предыдущими параметрами мы можем отправить письмо. Дополнительно мы должны указать следующие параметры:
- UseSsl — так как наше подключение шифруется;
- From — ящик, с которого отправляется письмо;
- To — кому отправляем;
- Subject — тема письма;
- Body — содержание письма.
В моем случае команда будет выглядеть так:
Данная команда, в случая yandex и многих других, публичных, провайдеров вернет ошибку:
- Send-MailMessage : Не удается прочитать данные из транспортного соединения: net_io_connectionclosed.
Эта проблема связана с тем, что библиотека .NET SmtpClient, которая работает с командой Send-MailMessage, может использовать шифрование SSL/TLS только с поддержкой STARTTLS. Стандарт STARTTLS расширял возможности шифрования и должен был стать массовым, но этого не случилось (и скорее всего не случится). Во время публикации стандарта STARTTLS был объявлен новый порт для SMTP — 587(msa), а порт 465 (smtps) объявили устаревшим. Так как новый стандарт так и не приобрел массовость провайдеры, чаще всего, пишут только про 465 порт, но и 587 так же у многих провайдеров работает.
Подводя коротко итог предыдущего абзаца, если провайдер пишет про 465 порт, а он не работает — попробуйте 587. В случае с яндексом это именно так.
Так же, если вам нужно что бы у получателя выводилось ваше имя/название компании, используйте следующий формат во From:
Несколько адресатов
Так же как и в случае обычного почтового клиента мы можем отправлять письма нескольким адресатам используя:
- To — обычный получатель;
- Cc — получатель копии;
- Bcc — получатель скрытой копии.
Если планируется использовать несколько почтовых ящиков, в одном параметре, разделяйте их запятыми:
Кодировка
Как вы знаете Windows пока не перевела работу ОС на UTF8 (используется ANSI и ASCII). В это же время UTF8 является стандартом для работы в интернете. По этой причине, если вы не укажете кодировку, то может получится следующая картина:
Отмечу, что это проблема возникнет в Powershell 5.1, которая установлена по умолчанию в Windows. В случае с Powershell 7.1, по умолчанию используется UTF8. Тем не менее вы можете установить свое значение:
Значения устанавливаются в параметре Encoding:
Отправка письма с разметкой HTML
Письма могут быть посланы как обычный текст или с HTML разметкой. Для разметки дополнительно к параметру Body нужно указать BodyAsHtml:
Вложения
Вложения можно перечислить используя параметр Attachments и пути до файлов:
Этот параметр так же принимает значения через конвейер т.е. мы можем получить все файлы в папке и отправить их:
Уведомления о доставке
Мы можем получить уведомления, если установим следующие параметры у -DeliveryNotificationsOptions:
- OnSuccess — при успешной доставке;
- OnFailure — если сообщение не доставлено;
- Delay — при задержке SMTP сервером.
Через запятую их можно установить несколько:
Уведомление будет доставлено на почтовый ящик.
Приоритет
Вы можете установить приоритет, который увидит получатель письма. Отмечу, что такой приоритет отображается не во всех клиентах. Приоритет определяется в параметре Priority со значениями:
Установка и настройка SMTP сервера на Windows Server 2016 / 2012 R2
Вы можете установить SMTP сервер с помощью встроенных средств во всех версиях Windows Server. Такой SMTP сервер внутри организации может работать в качестве почтового релея, который должен принимать и пересылать через себя SMTP сообщения от различных устройств (к примеру, сендеров, сканеров, устройств СКД и пр.) и приложений (веб приложения, SQL Reporting Services, SharePoint), которым необходимо иметь возможность отправлять почту через SMTP сервер. Такой релей может пересылать сообщения на полноценные Exchange сервер или на публичные почтовые сервисы в Интернет типа Gmail, Mail.ru, Office 365 и т.д (ведь не всегда целесообразно разворачивать полноценную внутреннюю почтовую инфраструктуру на базе Microsoft Exchange Server или других почтовых служб).
В этой статье мы покажем, как установить, настроить и протестировать работу SMTP сервера на Windows Server 2012 R2, 2016 и 2019, который будет функционировать в качестве mail релея. Такой SMTP сервер не хранит почтовые сообщения и на нем отсутствуют почтовые ящики, он сможет только отправлять или пересылать почту.
Установка службы SMTP на Windows Server 2016/2012 R2
SMTP сервер – это один из компонентов Windows Server, который можно установить через Server Manager. Для этого откройте консоль Server Manager Dashboard (servermanager.exe), перейдите в режим Add roles and features и на этапе выбора функций отметьте чекбокс у пункта SMTP Server. Для управления службой SMTP нужно установить консоли управления, которые входят в комплект роли Web Server IIS (вам будет предложено установить IIS Management Tools).
Оставьте все предлагаемые опции роли Web Server (IIS) и запустите установку.
Также вы можете установить компонент SMTP сервера с помощью одной команды PowerShell:
После окончания установки компонентов может потребоваться перезагрузка системы.
Настройка SMTP сервера на Windows Server
Управляется SMTP сервер консоль управления Internet Information Services (IIS) Manager 6. Открыть эту консоль можно через Server Manager: Tools-> Internet Information Services (IIS) 6.0 Manager или командой inetmgr6.exe.
В консоли IIS 6 Manager разверните ветку с именем сервера, щёлкните ПКМ по SMTP Virtual Server и откройте его свойства.
На вкладке General, если необходимо, выберите IP адрес, на котором должен отвечать SMTP сервер (если у сервера несколько IP адресов), и включите ведение логов Enable logging (чтобы сохранялась информация обо всех полученных письмах).
Затем перейдите на вкладку Access.
Здесь нажмите на кнопку Authentication и убедитесь, что разрешен анонимный доступ (Anonymous access).
Вернитесь на вкладку Access и нажмите кнопку Connection. Здесь вы можете указать IP адреса устройств, которым разрешено отправлять почту через наш SMTP релей. Нужно выбрать опцию Only the list below и указать список IP адресов, не забыв самого себя (127.0.0.1).
Аналогичным образом настройте список разрешенных IP в настройках Relay (нажмите соответствующую кнопку). В этой секции указано каким IP адресам (или подсетям) можно пересылать почту через ваш SMTP сервер.
Перейдите на вкладку Messages. Здесь указывается email, на который будут отправляться копии всех NDR отчетов (Send copy of Non-Delivery Report to:). Также здесь можно указать ограничения на максимальный размер писем (Limit message size KB) и количество получателей (Limit number of recepients per message).
Перейдите на вкладку Delivery:
Затем нажмите на кнопку Outbound Security. Здесь указывается, как нужно авторизоваться на почтовом сервере, на который ваш SMTP-сервере будет пересылать (relay) всю почту. К примеру, если вся почта будет отправляться на почтовый сервер Gmail и уже с него пересылаться адресатам, вам нужно выбрать тип аутентификации Basic authentication, указав в качестве пользователя и пароля данные для доступа к почтовому ящику на сервисе Gmail (в настройках аккаунта Google нужно разрешить отправку через smtp сервера gmail).
Затем нажмите на кнопку Advanced.
Здесь указывается FQDN имя вашего SMTP сервера. Нажмите кнопку Check DNS, чтобы проверить корректность записи в DNS.
Если сервер должен пересылать почту внешнему smtp серверу, нужно указать его имя в поле Smart host (к примеру smtp.gmail.com или smtp.office365.com).
Сохраните настройки SMTP сервера и перезапустите ваш виртуальный SMTP сервер для применения изменений.
- Настройки DNS критичны с точки зрения работоспособности почтовой системы. Если ваш SMTP сервер не может корректно разрешить DNS имена доменов, на которые он пытается отправить письма, доставка не удастся.
- Если ваш сервер сам будет отправлять почту в другие домены, важно, чтобы для вашего адреса была сформирована правильная PTR запись для разрешения обратных DNS запросов. PTR запись для белого IP адреса должна указывать на FQDN имя. В противном случае большинство внешних smtp серверов не будут принимать от вас почту, считая ваш сервер спамерским.
Автозапуск службы SMTPSVC
Осталось настроить автозапуск службы SMTP сервера. Быстрее всего это сделать из командной строки PowerShell:
set-service smtpsvc -StartupType Automatic
Проверим, что запущена служба SMTPSVC :
Проверка работы SMTP сервера на Windows Server
Ну и последнее, что осталось сделать, проверить работу созданного SMTP сервера. Проще всего это сделать, создав на рабочем столе текстовый файл smtp-test-email.txt и скопировав в него следующий текст, заменив имя отправителя и получателя на ваши.
From: server@localdomain.com
To: admin@localdomain.com
Subject: Email test
This is the test email
Скопируйте файл smtp-test-email.txt в каталог C:\inetpub\mailroot\Pickup. SMTP сервер следит за появлением файлов в этой каталоге и при обнаружении файла прочтет его содержимое и попытается отправить письмо с данной темой и текстом адресату, указанному в разделе To:.
Проверьте ящик получателя, в него должно прийти такое письмо.
Send-MailMessage -SMTPServer localhost -To admin@localdomain.com -From server@localdomain.com -Subject «Email test» -Body «This is the test email sent via PowerShell»
Если вы хотите, чтобы вы включили Basic Authentication (Обычная проверка подлинности) для авторизации всех ваших SMTP клиентов (вместо анонимной аутентификации), вы можете отправить письмо с smtp-аутентификацией через telnet следующим образом.
Также убедитесь, что на вашем SMTP сервере не блокируется порт TCP 25 при удаленном подключении (локальным файерволом, антивирусом или межсетевым экраном). Проще всего это сделать с компьютера Windows, IP адрес которого добавлен в разрешенные. Проверку доступности порта можно выполнить с помощью командлета Test-NetConnection:
Test-NetConnection smtpsrv1.name.local –port 25
Если 25 порт блокируется, проверьте настройки Windows Firewall, антивируса и аппаратных межсетевых экранов.
Итак, вы настроили собственный почтовый SMTP релей на Windows Server 2016/2012 R2 и протестировали отправку писем через него.