Powershell если не существует файл отправить почту
Для отправки писем в Powershell есть команда Send-MailMessage. С помощью этой команды мы можем выполнять отправку писем используя вложения, HTML формат и множеству получателей. У этой команды есть ряд особенностей, которые мы рассмотрим ниже на примерах.
Навигация по посту
1 Answer 1
Okay, the question is a little unclear, but I'll take a stab at it based on what I infer is "not working for you". I'm guessing that your script is successfully sending the message, and what's not working is that the formatting of the message is all wrong, for two reasons:
- output.txt is in plain text, not HTML. When rendered in HTML, the whitespace won't be preserved and there won't be any line breaks. If the whitespace consists of spaces, the consecutive spaces will be reduced to single spaces, and if it's tabs, I believe the text will all run together with no whitespace at all. I take it you were expecting $message.IsBodyHTML = $true to convert your plain text input to HTML, but that's not what it does. It just sets a property of the message that instructs mail clients to interpret the body as HTML (specifically, it sets the Content-Type header to "text/html"), but you have to actually supply it HTML code.
- You're setting the $style variable to a bunch of CSS code, but then you don't do anything with it. I presume you intended to add it to $message.Body. The problem with that is that you can't reliably put a style sheet in an email message; most clients will ignore it. The styles have to be inline.
output.txt should look like this:
The PowerShell script should look like this:
If you can't provide output.txt in HTML because it's generated automatically in plain text, then your script will need to convert it. If the format is consistently as shown in your example, that's not too complicated. Replace the $message.Body = line with this:
Вложения
Вложения можно перечислить используя параметр Attachments и пути до файлов:
Кодировка
Как вы знаете Windows пока не перевела работу ОС на UTF8 (используется ANSI и ASCII). В это же время UTF8 является стандартом для работы в интернете. По этой причине, если вы не укажете кодировку, то может получится следующая картина:
Отмечу, что это проблема возникнет в Powershell 5.1, которая установлена по умолчанию в Windows. В случае с Powershell 7.1, по умолчанию используется UTF8. Тем не менее вы можете установить свое значение:
- ASCII;
- BigEndianUnicode;
- Default;
- OEM;
- Unicode;
- UTF7;
- UTF8;
- UTF32.
Значения устанавливаются в параметре Encoding:
Установка модуля Exchange Online PowerShell V2 (EXO V2))
Для установки модуля Exchange Online PowerShell в Windows нужна версия PowerShell 5.x (PowerShell Core поддерживается, начиная с версии модуля ExchangeOnlineManagement 2.0.4).
Настройки политики запуска скриптов PowerShell на компьютере должны разрешать запуск локальных PS файлов:
Установите и обновите модуль PowershellGet:
Install-Module PowershellGet -Force
Для установки модуля EXOv2 (ExchangeOnlineManagement) из галереи скриптов PowerShell для всех пользователей компьютера, выполните:
Install-Module -Name ExchangeOnlineManagement -Force -Scope AllUsers
Теперь модуль можно импортировать в сессию:
Проверьте, что модуль установлен. Также отображается его версия (2.0.5 в моем случае):
(Get-Module -ListAvailable -Name ExchangeOnlineManagement) -ne $null
Для обновления модуля EXOv2 используйте команду:
Уведомления о доставке
Мы можем получить уведомления, если установим следующие параметры у -DeliveryNotificationsOptions:
Через запятую их можно установить несколько:
Уведомление будет доставлено на почтовый ящик.
Отправка писем
- UseSsl - так как наше подключение шифруется;
- From - ящик, с которого отправляется письмо;
- To - кому отправляем;
- Subject - тема письма;
- Body - содержание письма.
В моем случае команда будет выглядеть так:
Данная команда, в случая yandex и многих других, публичных, провайдеров вернет ошибку:
- Send-MailMessage : Не удается прочитать данные из транспортного соединения: net_io_connectionclosed.
Подводя коротко итог предыдущего абзаца, если провайдер пишет про 465 порт, а он не работает - попробуйте 587. В случае с яндексом это именно так.
Так же, если вам нужно что бы у получателя выводилось ваше имя/название компании, используйте следующий формат во From:
Аутентификация
Как видно на скриншоте - при каждом выполнении команды у нас появляется окно для ввода логина и пароля. Вы так же можете сохранить учетные данные в переменную и передавать ее в команды:
При работе с командой Get-Credential есть неочевидная деталь - ее запуск создает объект (логин и пароль) в памяти. Любая попытка его экспортировать (сохранить) приведет к шифрованию объекта ключем, индивидуальным для каждого пользователя. Т.е. это плохой вариант, если вы планируете отправлять письма со множества компьютеров - вам просто понадобится вводить эти данные у каждого пользователя.
Вы можете передать пароль обычным текстом, что решит проблему описанную выше:
Более подробно, про работу логинов и паролей в Powershell, описывалось в предыдущих статьях.
Как подставлять значения переменных в строках с Powershell
Управление Exchange Online с помощью командлетов модуля ExchangeOnlineManagement
Список доступных командлетов в модуле EXO v2 можно вывести командой:
Get-Command -Module ExchangeOnlineManagement
На данный момент доступно 23 командлета:
- Connect-ExchangeOnline
- Connect-IPPSSession
- Disconnect-ExchangeOnline
Обратите внимание, что названия некоторых команндлетов в модуле Exchange Online изменились. У большинства из них появился суффикс EXO. Например, вместо Get-Mailbox нужно использовать Get-EXOMailbox , вместо Get-MailboxPermission — Get-EXOMailboxPermission и т.д. Поэтому, если у вас остались скрипты для EXOv1, придется внимательно их переписать под EXOv2.
Можно вывести список ящиков в вашем тенанте Exchange или информацию о конкретном ящике:
Get-EXOMailbox |ft
Get-EXOMailbox kbuldogov
Вывести пользователей, у которых разрешен POP и IMAP доступ:
Get-EXOCasMailbox -PropertySets Imap,pop
Вывести размер всех ящиков:
Размеры всех общих ящиков:
Get-EXOMailbox | Where-Object | Get-EXOMailboxStatistics
Обратите внимание, что в модуле ExchangeOnlineManagement нет, например, командлета Set-Mailbox. Дело в том, что остальные доступные командлеты Exchange Online (более 750) импортируются в вашу PowerShell сессию после подключения к тенанту. Сначала вам нужно получить имя сессии:
Get-PSSession| select ConfigurationName,CurrentModuleName
По сгенерированному имени сессии можно получить список доступных командлетов:
02.02.2021
itpro
PowerShell, Windows 10, Windows Server 2016
комментариев 6
Для получения базовой информации о синтаксисе командлета, выполните команду:
Адрес SMTP сервера для отправки email указывать не обязательно, если вы задали адрес почтового сервера в переменной окружения $PSEmailServer.
Следующая простейшая команда PowerShell отправит письмо с указанной темой (Subject) и содержимым (Body) нескольким получателям.
Для удобства редактирования эту команду отправки можно представить так:
Send-MailMessage `
-SmtpServer smtp.winitpro.ru `
-To 'admin@winitpro.ru','manager@winitpro.ru' `
-From 'server@winitpro.ru' `
-Subject "test" `
-Body "Тема письма на русском" `
-Encoding 'UTF8'
Обратите, что в последней команде мы дополнительно указали, что нужно использовать для письма кодировку UTF8. Иначе, если тема или текст письма будут содержать русские буквы, то они будут отображены знаками вопроса.
В Windows PowerShell по умолчанию используются кодировки ANSI и ASCII. Если вы обновили свою версию до PowerShell Core 7.1, имейте в виду что в этой версии по умолчанию уже используется кодировка UTF8.
В следующей таблице перечислены параметры SMTP серверов популярных публичных email провайдеров, которые вы можете использовать для отправки почты из PowerShell (обратите внимание, что у большинства из них нужно дополнительно разрешить отправку писем через SMTP из интерфейса аккаунта):
В этом случае вы можете аутентифицироваться на 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 manager@winitpro.ru", "manager2@winitpro.ru"
From = "DC server "
Subject = "Отчет с сервера DC"
Body 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 (оповестить, если доставка отложена).
Предыдущая статья Следующая статья
Настройка NIC Teaming в Windows Server 2019/2016 и Windows 10
Сброс пароля компьютера в домене без перезагрузки
Как включить и настроить WinRM (Windows Remote Management) с помощью GPO?
GREP в PowerShell: Поиск текста в файле с Select-String
А так не проще? И без VBS
Send-MailMessage -From user@domain -To user_@domain_ -SmtpServer server_name(/ip) -Subject «Subject» -Body «text»;
В другой Вашей статье (про SMTP-сервер) прочитал, что файл можно положить в папку Pickup.
Попробовал файл .eml (из папки очереди) из одного SMTP сервера положить в папку Pickup другого SMTP-сервера (с другой стороны шлюза). Сработало, тот сервер отправил файл, пришло письмо, русские символы нормальные!
ну да, решение довольно странное, а архитектура похожа на происки безопасников в погонах … 🙂
I have a text file output.txt which has following content:
I want to send content of output.txt in a email as a body in Formatted HTML table look in Windows server 2008 R2. I am trying with below code, but its not working for me..where am I mistaking below ?
EDIT1
When i modified my code as below:
I am getting mail like this:
Note: I am using Powershell v1.0
1. "Not working" in which way? The more specific you are, the more likely someone will be able to identify the problem. 2. What are your intentions for $style? You're setting its value to a bunch of CSS code, but then you're not doing anything with it. It seems that there should be something like $message.Body = '
' + $style + '' + $message.Body between the last $style = [. ] statement and the $smtp = [. ] statement. 3. output.txt doesn't contain HTML. It should have HTML table data, otherwise the formatting will be all wrong. Is that what's "not working"?Отправка письма с разметкой HTML
Письма могут быть посланы как обычный текст или с HTML разметкой. Для разметки дополнительно к параметру Body нужно указать BodyAsHtml:
Настройка SMTP сервера
Ниже пример настроек для яндекса:
Адрес сервера, в Powershel, можно указать двумя способами. Можно объявить используя специальную встроенную переменную $PSEmailServer:
Такая переменная будет работать в рамках одной сессии Powershell (до закрытия консоли) и нам не нужно будет указывать ее в каждой команде. Например так:
Отмечу, что в случае яндекса и gmail знать логин/пароль и почтовый сервер не достаточно. В случае этих провайдеров, в их веб интерфейсах, понадобится настраивать специфические разрешения. В случае обычных, локальных серверов, этого обычно не требуется.
Порт сервера устанавливается в дополнительном параметре Port. Если он не указан, то будет использоваться порт по умолчанию - 25:
Несколько адресатов
Так же как и в случае обычного почтового клиента мы можем отправлять письма нескольким адресатам используя:
- To - обычный получатель;
- Cc - получатель копии;
- Bcc - получатель скрытой копии.
Если планируется использовать несколько почтовых ящиков, в одном параметре, разделяйте их запятыми:
Подключение к Exchange Online с помощью PowerShell
Для подключения к вашему тенанту Microsoft 365 с помощью модуля Exchange Online, исопльзуется командлет Connect-ExchangeOnline. Например, можно указать UPN пользователя с правами глобального администратора тенанта:
Укажите пароль пользователя и подтвердите вход через MFA (удобнее всего использовать приложение Microsoft Authenticator на смартфоне).
Если на компьютере не установлен браузер (например, вы подключаетесь к Exchange Online из Linux или Windows Server Core), сформировать строку и код для авторизации в PowerShell Core 7.x можно так:
Сформированный URL и код нужно использовать для аутентификации на другом компьютере с браузером.
Или используйте параметр –InlineCredential для интерактивного ввода пароля в консоли.
Если у вашего аккаунта есть доступ к нескольким тенантам Azure, можно указать имя с помощью параметра DelegatedOrganization:
Если для аккаунта отключен Modern Authentication, можно подключится так:
Вы можете проверить, что в системе есть активное подключение к Exchange Online так:
Get-PSSession| ft –AutoSize
После завершения работы с Exchange Online не забывайте корректно закрывать свою сессию с помощью командлета Disconnect-ExchangeOnline. Дело в том, что Exchange Online поддерживает максимум 5 одновременных PowerShell сессий. Если вы попробуете открыть шестую сессию, появится ошибка:
Следующий код можно использовать в ваших PowerShell скриптах для проверки, что подключение к Exchange Online через модуль EXOv2 уже активно. Это позволит избежать создания лишних удаленных PowerShell сессий к Microsoft 365.
В следующей статье описан способ удалённого подключения к Exchange Online без установки модуля EXOv2:
Приоритет
Вы можете установить приоритет, который увидит получатель письма. Отмечу, что такой приоритет отображается не во всех клиентах. Приоритет определяется в параметре Priority со значениями:
12.04.2022
itpro
Exchange, Microsoft 365, Office 365, Outlook, PowerShell
комментария 2
В Exchange Server и Microsoft 365 (Exchange Online) вы можете предоставить пользователям права на отправку писем от имени другого пользователя или почтового ящика. В этой статье мы рассмотрим, как предоставить права send as/send on behalf через Exchange Admin Center и с помощью PowerShell.
В Exchange есть два типа полномочий на отправку от имени другого ящика или группы:
-
Send as – разрешить пользователю отправку писем с другого почтового ящика. Получатель в данном не видит, что на самом деле письмо ему отправил другой пользователь;
Предоставление прав Send as в Exchange Server
В on-prem Exchange Server 2019,2016, 2013 вы можете предоставить права на ящик через Exchange Admin Center.
Если вы одновременно предоставите пользователю право Send as и Send on behalf, то по умолчанию при отправке писем будет использоваться Send as.
Аналогичным образом можно предоставить права отправки от имени группы рассылок и mail enabled security групп (вкладка group delegation).
Вы можете предоставить права send as с помощью PowerShell. Для этого запустите консоль EMS или подключитесь к своему серверу Exchange удаленно из консоли PowerShell:
Чтобы предоставить права SendAs, выполните команду (права назначаются на уровне учётной записи в Active Directory, их можно также насроит вручную на вкладке Security в свойствах пользователя в консоли ADUC):
Get-Mailbox secretar@winitpro.ru | Add-ADPermission -User kbuldogov@winitpro.ru -ExtendedRights "Send As"
Для предоставления права SendOnBehalf, используется другая команда:
Предыдущая команда очищает текущий список доступа и добавляет в него только новый аккаунт. Если вы хотите добавить в список доступа SendOnBehalf нового пользователя, выполните:
Можно предоставить права отправки на все почтовый ящики, в определенном Organizational Unit в Active Directory:
Чтобы предоставить права отправки от имени динамической группы рассылки:
Set-DynamicDistributionGroup "IT_DeptUsers" -GrantSendOnBehalfTo @
В on-premises Exchange Server для распространения настроек может придется подождать до двух часов или перезапустить сервис Exchange Information Store.
Если при отправке о имени другого ящика вы получаете отбойник:
Отправка писем от имени в Microsoft 365 (Exchange Online)
В Exchange Online вы можете предоставить права отправки от имени ящика или группы рассылки с помощь Exchange Admin Center.
Также вы можете предоставить права sendas в Exchage Online с помощью PowerShell. Подключитесь к своему тенанту Micorosft 365 с помощью модуля Exchange Online PowerShell (EXO):
Чтобы разрешить пользователю отправку писем от имени группы рассылки, используется командлет Add-RecipientPermission:
Add-RecipientPermission -Trustee -AccessRights SendAs
Чтобы дать пользователю права на отправку почты (Send As) от имени группы рассылки:
Get-DistributionGroup -Identity global_server_admins | Add-RecipientPermission -AccessRights SendAs -Trustee kbuldogov
Чтобы предоставить право SendOnBehalf на ящик пользовател, выполните:
Get-Mailbox maxadm | Set-Mailbox -GrantSendOnBehalfTo HenriettaM
Для предоставления прав отправки от имени группы Microsoft365:
Set-UnifiedGroup msteams_cc294d -GrantSendOnBehalfTo maxadm
Получить отчет со списком пользователей, у которых есть права SendOnBehalf на указанный ящик:
Get-Mailbox maxadm | Where | Select UserprincipalName,GrantSendOnBehalfTo
Вывести список пользователей с правами SendAs на ящике:
Найти все почтовые ящики в организации, на которых предоставлены права SendAs для указанного пользователя:
Чтобы удалить права SendAs на ящик, используется командлет Remove-RecipientPermission:
Предыдущая статья Следующая статья
Вывести все ящики, к которым есть доступ у определенного пользователя Exchange/Microsoft 365
Аудит действий пользователей в почтовых ящиках Exchange и Microsoft 365
Управление правами доступа к ящикам и папкам Exchange и Microsoft 365
Управление доступом и доступностью в календарях Exchange/Microsoft 365
«Предыдущие команды очищают текущий список доступа и добавляют только новый аккаунт.»
Это справедливо только для связки Set-Mailbox + -GrantSendOnBehalfTo. При выполнении Add-MailboxPermission старые права будут сохранены.
А по написанному в статье можно подумать, что такое поведение для обеих команд.
27.10.2021
itpro
Exchange, Office 365, PowerShell
Один комментарий
PowerShell это основное средство администрирования как on-premises организаций Exchange Server, так и облачного Exchange Online в Microsoft 365. В этой статье мы покажем, как установить PowerShell модуль Exchange Online PowerShell v2 (EXO V2) в Windows, как подключиться к вашем тенанту Exchange Online и управлять ящиками и другими почтовыми объектами в Micrtosoft 365.
Обратите внимание, что сейчас одновременно существуют два модуля для управления Exchange Online: Exchange Online PowerShell v1 и современный Exchange Online PowerShell v2 (EXO v2). Если нет четких оснований использовать старый модуль (legacy скрипты и т.д.), старайтесь всегда использовать EXO v2: он работает быстрее (как и новый модуль Azure AD, он основан на REST API в реализации Microsoft Graph), командлеты оптимизированы для обработки множества объектов, вместо Basic используется Modern аутентификация, поддерживается MFA аутентификация, версии ExchangeOnlineManagement 2.0.4 и выше работают в версиях PowerShell Core 6.x, 7x и macOS, Ubintu 18.04/20.04.
Читайте также: