Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Создания правил Ootlook через powershell (http://forum.oszone.net/showthread.php?t=300718)

dosperados 04-06-2015 08:37 2514777

Создания правил Ootlook через powershell
 
Добрый день пытаюсь создать правило в 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 2514780

$FromCondition.RecipientAddress.("fz223@domen.ru") заменить на $FromCondition.RecipientAddress.Add("fz223@domen.ru")

За основу берите скрипт - https://dandarache.wordpress.com/201...es-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 2514799

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 2514813

"_ФЗ-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 2515137

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

мне нужны были вот эти Conditions.SentTo
Код:

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

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


Время: 18:12.

Время: 18:12.
© OSzone.net 2001-