Установка свойства с помощью win32com - PullRequest
5 голосов
/ 17 августа 2011

Я пытаюсь создать кучу правил Outlook автоматически. Я использую Python 2.7, win32com и Outlook 2007. Для этого я должен создать новый объект Rule и указать папку для его действия перемещения. Однако я не могу установить свойство Folder успешно - оно просто остается None, несмотря на то, что я предоставляю объект правильного типа.

import win32com.client
from win32com.client import constants as const

o = win32com.client.gencache.EnsureDispatch("Outlook.Application")
rules = o.Session.DefaultStore.GetRules() 

rule = rules.Create("Python rule test", const.olRuleReceive) 
condition = rule.Conditions.MessageHeader 
condition.Text = ('Foo', 'Bar')
condition.Enabled = True

root_folder = o.GetNamespace('MAPI').Folders.Item(1)
foo_folder = root_folder.Folders['Notifications'].Folders['Foo']

move = rule.Actions.MoveToFolder
print foo_folder
print move.Folder
move.Folder = foo_folder
print move.Folder

# move.Enabled = True
# rules.Save()

Печать

<win32com.gen_py.Microsoft Outlook 12.0 Object Library.MAPIFolder instance at 0x51634584>
None
None

Я посмотрел код, сгенерированный makepy при использовании win32com в нединамическом режиме. Класс _MoveOrCopyRuleAction имеет запись для 'Folder' в его _prop_map_put_ dict, но кроме этого я в тупике.

Ответы [ 2 ]

1 голос
/ 22 марта 2018

С comtypes.client вместо win32com.client вы можете сделать:

import comtypes.client

o = comtypes.client.CreateObject("Outlook.Application")
rules = o.Session.DefaultStore.GetRules() 

rule = rules.Create("Python rule test", 0 ) # 0 is the value for the parameter olRuleReceive
condition = rule.Conditions.Subject # I guess MessageHeader works too
condition.Text = ('Foo', 'Bar')
condition.Enabled = True

root_folder = o.GetNamespace('MAPI').Folders.Item(1)
foo_folder = root_folder.Folders['Notifications'].Folders['Foo']

move = rule.Actions.MoveToFolder
move.__MoveOrCopyRuleAction__com__set_Enabled(True) # Need this line otherwise 
                                                    # the folder is not set in outlook
move.__MoveOrCopyRuleAction__com__set_Folder(foo_folder) # set the destination folder

rules.Save() # to save it in Outlook

Я знаю, что это не с win32com.client, но и не с IronPython!

1 голос
/ 17 августа 2011

Попробуйте SetFolder ()

Я думаю, из краткого прочтения вашего кода попробуйте SetFolder (move, foo_folder)

win32com совершает удивительную магию, но иногда COM-объекты просто побеждают ее.когда объект не может следовать соглашению по питону, за кулисами создается сеттер и геттер в форме Set {name} Get {name}

см .: http://permalink.gmane.org/gmane.comp.python.windows/3231 NB - Марк Хэммондс, как отлаживать комбесценно - этот материал просто скрыт в группах пользователей ...

...