Войти

Показать полную графическую версию : [решено] Создания правил Ootlook через powershell


dosperados
04-06-2015, 08:37
Добрый день пытаюсь создать правило в Outlook по переносу входящей почты в папку если письмо было адресовано на конкретный адрес. (т.е. используются алиасы и если письмо адресовано на конкретный алиас переложить его в нужную папку)


$oOutlook = New-Object -ComObject Outlook.Application
$OutlookPath = Split-Path ($oOutlook.Session.DefaultStore).FilePath
Write-Verbose "Получаем MAPI"
$oNameSpace = $oOutlook.GetNamespace("MAPI")
Write-Verbose "Получаем папку Входящие"
$oMAPIFolder = $oNameSpace.GetDefaultFolder(6)
Write-Verbose "Непосредственно проверяем существования папки"
try {
$oMyMAPIFolder = $oMAPIFolder.Folders.Item("_ФЗ-223")
} catch {
Write-Verbose "Если на предидущем этапе ошибка, значит папки нет, => создаем ее."
$oMyMAPIFolder = $oMAPIFolder.Folders.Add("_ФЗ-223")
}

Write-Verbose "Add-Type cmdlet to load the outlook interop assembly"
Add-Type -AssemblyName microsoft.office.interop.outlook
Write-Verbose "Adds the OlDefaultFolders and the OlRuleType type enumerations and stores them in the $olFolders and $olRuleType variables"
$olFolders = "Microsoft.Office.Interop.Outlook.OlDefaultFolders" -as [type]
$olRuleType = "Microsoft.Office.Interop.Outlook.OlRuleType" -as [type]
Write-Verbose "Получение папки входящие"
$inbox = $oNameSpace.getDefaultFolder($olFolders::olFolderInbox)
Write-Verbose "Получения объекта ""Rules"" "
$rules = $oOutlook.session.DefaultStore.GetRules()
#region Проверка создавали ли правило ранее
try {
$ExistRule = $rules.get_Item('ФЗ-223_rule')
} catch {
Write-Verbose "Если на предидущем этапе ошибка, значит правило не создано, => создаем ее."
Write-Verbose "Создание правила"
$rule = $rules.Create("ФЗ-223_rule",$olRuleType::OlRuleReceive)
Write-Verbose "Заполнение параметров правила"
Write-Verbose "Поле ОТ:"
$FromCondition = $rule.Conditions
$FromCondition.Enabled = $true
$fromCondition.Recipients.ResolveAll()
$FromCondition.RecipientAddress.("fz223@domen.ru")
$FromCondition.from.Enabled = $true
Write-Verbose "Выбираем папку для перемещения в неё писем"
[string]$RedirectFolder = "_ФЗ-223"
$d = [System.__ComObject].InvokeMember(
"EntryID",
[System.Reflection.BindingFlags]::GetProperty,
$null,
$inbox.Folders.Item($RedirectFolder),
$null)
$MoveTarget = $oNameSpace.getFolderFromID($d)
$MoveRuleAction = $rule.Actions.MoveToFolder
[Microsoft.Office.Interop.Outlook._MoveOrCopyRuleAction].InvokeMember(
"Folder",
[System.Reflection.BindingFlags]::SetProperty,
$null,
$MoveRuleAction,
$MoveTarget)
$MoveRuleAction.Enabled = $true
Write-Verbose "Сохраняем правило"
$rules.Save()


Выдает вот такую ошибку.


Исключение при вызове "Save" с "0" аргументами: "Невозможно сохранить одно или несколько правил из-за недопустимости действий или условий."
строка:86 знак:1
+ $rules.Save()
+ ~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : COMException

Kazun
04-06-2015, 08:44
$FromCondition.RecipientAddress.("fz223@domen.ru") заменить на $FromCondition.RecipientAddress.Add("fz223@domen.ru")

За основу берите скрипт - https://dandarache.wordpress.com/2011/07/25/using-powershell-to-create-rules-in-outlook/


Отработает при условии,что папка _ФЗ-223 является подпапкой INBOX.
$RuleName = "ФЗ-223_rule"
$RedirectFolder = "_ФЗ-223"
$FromEmail = "fz223@domen.ru"

$rules = $outlook.session.DefaultStore.GetRules()
$rule = $rules.Create($RuleName,$olRuleType::OlRuleReceive)

$d = [System.__ComObject].InvokeMember(
"EntryID",
[System.Reflection.BindingFlags]::GetProperty,
$null,
$inbox.Folders.Item($RedirectFolder),
$null
)

$MoveTarget = $namespace.getFolderFromID($d)

$MoveRuleAction = $rule.Actions.MoveToFolder
[Microsoft.Office.Interop.Outlook._MoveOrCopyRuleAction].InvokeMember(
"Folder",
[System.Reflection.BindingFlags]::SetProperty,
$null,
$MoveRuleAction,
$MoveTarget)
$MoveRuleAction.Enabled = $true

$FromCondition = $rule.Conditions.From
$FromCondition.Enabled = $true
$FromCondition.Recipients.Add($FromEmail)
$fromCondition.Recipients.ResolveAll()

$rules.Save()

dosperados
04-06-2015, 09:55
Kazun, Так и брал за основу скрипт с этого сайта но так как вы написали тоже не работает.

$Outlook = New-Object -ComObject Outlook.Application
$olFolders = "Microsoft.Office.Interop.Outlook.OlDefaultFolders" -as [type]
$olRuleType = "Microsoft.Office.Interop.Outlook.OlRuleType" -as [type]
Write-Verbose "Получение папки входящие"
$inbox = $oNameSpace.getDefaultFolder($olFolders::olFolderInbox)


$RuleName = "ФЗ-223_rule"
$RedirectFolder = "_ФЗ-223"
$FromEmail = "fz223@domen.ru"

$rules = $outlook.session.DefaultStore.GetRules()
$rule = $rules.Create($RuleName,$olRuleType::OlRuleReceive)

$d = [System.__ComObject].InvokeMember(
"EntryID",
[System.Reflection.BindingFlags]::GetProperty,
$null,
$inbox.Folders.Item($RedirectFolder),
$null
)

$MoveTarget = $namespace.getFolderFromID($d)

$MoveRuleAction = $rule.Actions.MoveToFolder
[Microsoft.Office.Interop.Outlook._MoveOrCopyRuleAction].InvokeMember(
"Folder",
[System.Reflection.BindingFlags]::SetProperty,
$null,
$MoveRuleAction,
$MoveTarget)
$MoveRuleAction.Enabled = $true

$FromCondition = $rule.Conditions.From
$FromCondition.Enabled = $true
$FromCondition.Recipients.Add($FromEmail)
$fromCondition.Recipients.ResolveAll()

$rules.Save()

Пишет ошибка в условии или действии

Исключение при вызове "Save" с "0" аргументами: "Невозможно сохранить одно или несколько правил из-за недопустимости действий или у
словий."
\69d25aaf-ebb6-4b49-8f09-41dd00242570.ps1:39 знак:5
+ $rules.Save()
+ ~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : COMException

Kazun
04-06-2015, 10:42
"_ФЗ-223" - где располагается данная папка?

И скрипт содержит ошибки и отсутсвуют команды.

$oOutlook = New-Object -ComObject Outlook.Application
$olFolders = "Microsoft.Office.Interop.Outlook.OlDefaultFolders" -as [type]
$olRuleType = "Microsoft.Office.Interop.Outlook.OlRuleType" -as [type]
Write-Verbose "Получение папки входящие"
$oNameSpace = $oOutlook.GetNamespace("MAPI")
$inbox = $oNameSpace.getDefaultFolder($olFolders::olFolderInbox)


$RuleName = "ФЗ-223_rule"
$RedirectFolder = "_ФЗ-223"
$FromEmail = "fz223@domen.ru"

$rules = $outlook.session.DefaultStore.GetRules()
$rule = $rules.Create($RuleName,$olRuleType::OlRuleReceive)

$d = [System.__ComObject].InvokeMember(
"EntryID",
[System.Reflection.BindingFlags]::GetProperty,
$null,
$inbox.Folders.Item($RedirectFolder),
$null
)

$MoveTarget = $namespace.getFolderFromID($d)
$MoveRuleAction = $rule.Actions.MoveToFolder

[Microsoft.Office.Interop.Outlook._MoveOrCopyRuleAction].InvokeMember(
"Folder",
[System.Reflection.BindingFlags]::SetProperty,
$null,
$MoveRuleAction,
$MoveTarget)
$MoveRuleAction.Enabled = $true

$FromCondition = $rule.Conditions.From
$FromCondition.Enabled = $true
$FromCondition.Recipients.Add($FromEmail)
$fromCondition.Recipients.ResolveAll()

$rules.Save()

dosperados
05-06-2015, 08:05
Добрый день, пошел от обратного) создал в ручную правило, получил его параметры найдя его по имени и понял что я работал не с теми объектами:

мне нужны были вот эти Conditions.SentTo
Write-Verbose "Заполнение параметров правила"
$Condition = $rule.Conditions.SentTo
$Condition.Enabled = $true
$Condition.Recipients.Add($SendtoEmail)

Если нужен полный рабочий код скрипта напишите, скину.




© OSzone.net 2001-2012