[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