Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting a property using win32com

I'm trying to create a bunch of Outlook rules automatically. I'm using Python 2.7, win32com, and Outlook 2007. To do this I must create a new Rule object and specify a folder for its move action. However, I can't set the Folder property successfully -- it just stays None despite me giving an object of the right type.

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()

Prints

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

I've looked at the code generated by makepy when using win32com in non-dynamic mode. The class _MoveOrCopyRuleAction has an entry for 'Folder' in its _prop_map_put_ dict, but other than that I'm stumped.

like image 675
PAG Avatar asked Oct 25 '22 02:10

PAG


2 Answers

With comtypes.client instead of win32com.client you can do:

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

I know it's not with win32com.client, but not with IronPython either!

like image 77
Ben.T Avatar answered Oct 27 '22 11:10

Ben.T


Try SetFolder()

I think from a cursory reading of your code try SetFolder(move, foo_folder)

win32com does some amazing magic but at times COM objects just defeat it. when the object cannot follow the pythonic convention, behind the scenes a setter and getter is created of form Set{name} Get{name}

see: http://permalink.gmane.org/gmane.comp.python.windows/3231 NB - Mark Hammonds how to debug com is priceless - this stuff is just hidden in usegroups ...

like image 29
lifeisstillgood Avatar answered Oct 27 '22 09:10

lifeisstillgood