[Spambayes-checkins] spambayes/Outlook2000 msgstore.py,1.49,1.50
Mark Hammond
mhammond at users.sourceforge.net
Sun Jul 20 21:50:43 EDT 2003
Update of /cvsroot/spambayes/spambayes/Outlook2000
In directory sc8-pr-cvs1:/tmp/cvs-serv29259
Modified Files:
msgstore.py
Log Message:
Rationalize code that creates a message object. Add IsFilterCandidate()
method to a message object to determine if this is a message we should
try and filter. Add similar concept to the Message generators used by
the training ops.
Index: msgstore.py
===================================================================
RCS file: /cvsroot/spambayes/spambayes/Outlook2000/msgstore.py,v
retrieving revision 1.49
retrieving revision 1.50
diff -C2 -d -r1.49 -r1.50
*** msgstore.py 14 Jul 2003 10:52:51 -0000 1.49
--- msgstore.py 21 Jul 2003 03:50:41 -0000 1.50
***************
*** 46,50 ****
# return a folder object with the parent, or None
raise NotImplementedError
! def GetMessageGenerator(self, folder):
# Return a generator of MsgStoreMsg objects for the folder
raise NotImplementedError
--- 46,50 ----
# return a folder object with the parent, or None
raise NotImplementedError
! def GetMessageGenerator(self, folder, only_filter_candidates = True):
# Return a generator of MsgStoreMsg objects for the folder
raise NotImplementedError
***************
*** 77,80 ****
--- 77,85 ----
# Copy the message to a folder.
raise NotImplementedError
+ def IsFilterCandidate(self):
+ # Return True if this is a message that should be checked for spam
+ # Return False if it should be ignored (eg, user-composed message,
+ # undeliverable report, meeting request etc.
+ raise NotImplementedError
# Our MAPI implementation
***************
*** 328,341 ****
print GetCOMExceptionString(details)
return None
- prop_ids = PR_PARENT_ENTRYID, PR_SEARCH_KEY, PR_MESSAGE_FLAGS
mapi_object = self._OpenEntry(message_id)
! hr, data = mapi_object.GetProps(prop_ids,0)
! folder_eid = data[0][1]
! searchkey = data[1][1]
! flags = data[2][1]
! folder_id = message_id[0], folder_eid
! folder = MAPIMsgStoreFolder(self, folder_id,
! "Unknown - temp message", -1)
! return MAPIMsgStoreMsg(self, folder, message_id, searchkey, flags)
_MapiTypeMap = {
--- 333,339 ----
print GetCOMExceptionString(details)
return None
mapi_object = self._OpenEntry(message_id)
! hr, data = mapi_object.GetProps(MAPIMsgStoreMsg.message_init_props,0)
! return MAPIMsgStoreMsg(self, data)
_MapiTypeMap = {
***************
*** 401,415 ****
return self.msgstore.outlook.Session.GetFolderFromID(hex_item_id, hex_store_id)
! def GetMessageGenerator(self):
folder = self.OpenEntry()
table = folder.GetContentsTable(0)
! # Limit ourselves to IPM.Note objects - ie, messages.
! restriction = (mapi.RES_PROPERTY, # a property restriction
! (mapi.RELOP_GE, # >=
! PR_MESSAGE_CLASS_A, # of the this prop
! (PR_MESSAGE_CLASS_A, "IPM.Note"))) # with this value
! table.Restrict(restriction, 0)
! prop_ids = PR_ENTRYID, PR_SEARCH_KEY, PR_MESSAGE_FLAGS
! table.SetColumns(prop_ids, 0)
while 1:
# Getting 70 at a time was the random number that gave best
--- 399,413 ----
return self.msgstore.outlook.Session.GetFolderFromID(hex_item_id, hex_store_id)
! def GetMessageGenerator(self, only_filter_candidates = True):
folder = self.OpenEntry()
table = folder.GetContentsTable(0)
! if only_filter_candidates:
! # Limit ourselves to IPM.Note objects - ie, messages.
! restriction = (mapi.RES_PROPERTY, # a property restriction
! (mapi.RELOP_GE, # >=
! PR_MESSAGE_CLASS_A, # of the this prop
! (PR_MESSAGE_CLASS_A, "IPM.Note"))) # with this value
! table.Restrict(restriction, 0)
! table.SetColumns(MAPIMsgStoreMsg.message_init_props, 0)
while 1:
# Getting 70 at a time was the random number that gave best
***************
*** 419,425 ****
break
for row in rows:
! item_id = self.id[0], row[0][1] # assume in same store as folder!
! yield MAPIMsgStoreMsg(self.msgstore, self,
! item_id, row[1][1], row[2][1])
def GetNewUnscoredMessageGenerator(self, scoreFieldName):
--- 417,425 ----
break
for row in rows:
! # Our restriction helped, but may not have filtered
! # every message we don't want to touch.
! msg = MAPIMsgStoreMsg(self.msgstore, row)
! if not only_filter_candidates or msg.IsFilterCandidate():
! yield msg
def GetNewUnscoredMessageGenerator(self, scoreFieldName):
***************
*** 431,436 ****
field_id = PROP_TAG( PT_DOUBLE, PROP_ID(resolve_ids[0]))
# Setup the properties we want to read.
! prop_ids = PR_ENTRYID, PR_SEARCH_KEY, PR_MESSAGE_FLAGS
! table.SetColumns(prop_ids, 0)
# Set up the restriction
# Need to check message-flags
--- 431,435 ----
field_id = PROP_TAG( PT_DOUBLE, PROP_ID(resolve_ids[0]))
# Setup the properties we want to read.
! table.SetColumns(MAPIMsgStoreMsg.message_init_props, 0)
# Set up the restriction
# Need to check message-flags
***************
*** 458,471 ****
break
for row in rows:
! item_id = self.id[0], row[0][1] # assume in same store as folder!
! yield MAPIMsgStoreMsg(self.msgstore, self,
! item_id, row[1][1], row[2][1])
class MAPIMsgStoreMsg(MsgStoreMsg):
! def __init__(self, msgstore, folder, entryid, searchkey, flags):
! self.folder = folder
self.msgstore = msgstore
self.mapi_object = None
! self.id = entryid
self.subject = None
# Search key is the only reliable thing after a move/copy operation
--- 457,484 ----
break
for row in rows:
! yield MAPIMsgStoreMsg(self.msgstore, row)
class MAPIMsgStoreMsg(MsgStoreMsg):
! # All the properties we must initialize a message with.
! # These include all the IDs we need, parent IDs, any properties needed
! # to determine if this is a "filterable" message, etc
! message_init_props = (PR_ENTRYID, PR_STORE_ENTRYID, PR_SEARCH_KEY,
! PR_PARENT_ENTRYID, # folder ID
! PR_MESSAGE_CLASS_A) # 'IPM.Note' etc
!
! def __init__(self, msgstore, prop_row):
self.msgstore = msgstore
self.mapi_object = None
!
! # prop_row is a single mapi property row, with fields as above.
! tag, eid = prop_row[0] # ID
! tag, store_eid = prop_row[1]
! tag, searchkey = prop_row[2]
! tag, parent_eid = prop_row[3]
! tag, msgclass = prop_row[4]
!
! self.id = store_eid, eid
! self.folder_id = store_eid, parent_eid
! self.msgclass = msgclass
self.subject = None
# Search key is the only reliable thing after a move/copy operation
***************
*** 475,479 ****
# Thus, searchkey is the only reliable long-lived message key.
self.searchkey = searchkey
- self.flags = flags # flags are unreliable - they change!
self.dirty = False
--- 488,491 ----
***************
*** 509,512 ****
--- 521,531 ----
return self.msgstore.outlook.Session.GetItemFromID(hex_item_id, hex_store_id)
+ def IsFilterCandidate(self):
+ # We don't attempt to filter:
+ # * Non-mail items
+ # Later we would like to add:
+ # * Messages that have never been sent (ie, user-composed)
+ return self.msgclass.lower().startswith("ipm.note")
+
def _GetPropFromStream(self, prop_id):
try:
***************
*** 809,813 ****
"asking me to move a dirty message - later saves will fail!"
dest_folder = self.msgstore._OpenEntry(folder.id)
! source_folder = self.msgstore._OpenEntry(self.folder.id)
flags = 0
if isMove: flags |= MESSAGE_MOVE
--- 828,832 ----
"asking me to move a dirty message - later saves will fail!"
dest_folder = self.msgstore._OpenEntry(folder.id)
! source_folder = self.msgstore._OpenEntry(self.folder_id)
flags = 0
if isMove: flags |= MESSAGE_MOVE
***************
*** 824,828 ****
# the item, and set the store_id to the dest folder.
self.id = None
! self.folder = None
def MoveTo(self, folder):
--- 843,847 ----
# the item, and set the store_id to the dest folder.
self.id = None
! self.folder_id = None
def MoveTo(self, folder):
***************
*** 833,848 ****
def GetFolder(self):
# return a folder object with the parent, or None
! folder = self.msgstore._OpenEntry(self.id)
! prop_ids = PR_PARENT_ENTRYID,
! hr, data = folder.GetProps(prop_ids,0)
! # Put parent ids together
! parent_eid = data[0][1]
! parent_id = self.id[0], parent_eid
! parent = self.msgstore._OpenEntry(parent_id)
! # Finally get the display name.
! hr, data = folder.GetProps((PR_DISPLAY_NAME_A,), 0)
! name = data[0][1]
! count = parent.GetContentsTable(0).GetRowCount(0)
! return MAPIMsgStoreFolder(self.msgstore, parent_id, name, count)
def RememberMessageCurrentFolder(self):
--- 852,858 ----
def GetFolder(self):
# return a folder object with the parent, or None
! folder_id = (mapi.HexFromBin(self.folder_id[0]),
! mapi.HexFromBin(self.folder_id[1]))
! return self.msgstore.GetFolder(folder_id)
def RememberMessageCurrentFolder(self):
***************
*** 882,889 ****
from win32com.client import Dispatch
outlook = Dispatch("Outlook.Application")
! eid = outlook.Session.GetDefaultFolder(constants.olFolderInbox).EntryID
!
store = MAPIMsgStore()
! for folder in store.GetFolderGenerator([eid,], True):
print folder
for msg in folder.GetMessageGenerator():
--- 892,899 ----
from win32com.client import Dispatch
outlook = Dispatch("Outlook.Application")
! inbox = outlook.Session.GetDefaultFolder(constants.olFolderInbox)
! folder_id = inbox.Parent.StoreID, inbox.EntryID
store = MAPIMsgStore()
! for folder in store.GetFolderGenerator([folder_id,], True):
print folder
for msg in folder.GetMessageGenerator():
More information about the Spambayes-checkins
mailing list