def SetProperties( msg, propDict): """ Given a Python dictionary, set the objects properties. If the dictionary key is a string, then a property ID is queried otherwise the ID is assumed native. Coded for maximum efficiency wrt server calls - ie, maximum of 2 calls made to the object, regardless of the dictionary contents (only 1 if dictionary full of int keys) """ newProps = [] # First pass over the properties we should get IDs for. for key, val in propDict.iteritems(): if type(key) in [str, unicode]: newProps.append((mapi.PS_PUBLIC_STRINGS, key)) # Query for the new IDs if newProps: newIds = msg.GetIDsFromNames(newProps, mapi.MAPI_CREATE) newIdNo = 0 newProps = [] for key, val in propDict.iteritems(): if type(key) in [str, unicode]: type_val=type(val) if type_val in [str, unicode]: tagType = mapitags.PT_UNICODE elif type_val==IntType: tagType = mapitags.PT_I4 elif type_val==TimeType: tagType = mapitags.PT_SYSTIME else: raise ValueError("The type of object %s(%s) can not be written" % (repr(val),type_val)) key = mapitags.PROP_TAG(tagType, mapitags.PROP_ID(newIds[newIdNo])) newIdNo = newIdNo + 1 newProps.append( (key, val) ) msg.SetProps(newProps)
def GetProperties(obj, propList): """Given a MAPI object and a list of properties, return a list of property values. Allows a single property to be passed, and the result is a single object. Each request property can be an integer or a string. Of a string, it is automatically converted to an integer via the GetIdsFromNames function. If the property fetch fails, the result is None. """ bRetList = 1 if type(propList) not in [TupleType, ListType]: bRetList = 0 propList = (propList, ) realPropList = [] rc = [] for prop in propList: if type(prop) != IntType: # Integer props = ((mapi.PS_PUBLIC_STRINGS, prop), ) propIds = obj.GetIDsFromNames(props, 0) prop = mapitags.PROP_TAG(mapitags.PT_UNSPECIFIED, mapitags.PROP_ID(propIds[0])) realPropList.append(prop) hr, data = obj.GetProps(realPropList, 0) if hr != 0: data = None return None if bRetList: return map(lambda (v): v[1], data) else: return data[0][1]
def SetPropertyValue(obj, prop, val): if type(prop)!=IntType: props = ( (mapi.PS_PUBLIC_STRINGS, prop), ) propIds = obj.GetIDsFromNames(props, mapi.MAPI_CREATE) if val == (1==1) or val == (1==0): type_tag = mapitags.PT_BOOLEAN else: type_tag = _MapiTypeMap.get(type(val)) if type_tag is None: raise ValueError("Don't know what to do with '%r' ('%s')" % (val, type(val))) prop = mapitags.PROP_TAG( type_tag, mapitags.PROP_ID(propIds[0])) if val is None: # Delete the property obj.DeleteProps((prop,)) else: obj.SetProps(((prop,val),))