Отслеживайте изменение категории/папки в Outlook с помощью Python

Я хочу создать инструмент Python, который отслеживает изменения категорий и папок в Outlook.

До сих пор мне удалось подключиться к событию OnNewMailEx и отслеживать все входящие электронные письма, используя код ниже:

import win32com.client
import pythoncom
import re

def getPath(folder, path=[]):
    if folder.parent.parent.parent:
        path.append(folder.name)
        getPath(folder.parent, path)
    return "\\".join(reversed(path))

class Handler_Class(object):
    def OnNewMailEx(self, receivedItemsIDs):
        for ID in receivedItemsIDs.split(","):
            mailItem = outlook.Session.GetItemFromID(ID)
            if re.search("(TS)|(ST)", mailItem.Parent.FolderPath) != None:
                print "Subj: " + mailItem.Subject
                print "Time: " + str(mailItem.ReceivedTime)
                print "Parent: " + str(mailItem.Parent.FolderPath)
                # print "Body: " + mailItem.Body.encode( 'ascii', 'ignore' )
                print "========"

outlook = win32com.client.DispatchWithEvents("Outlook.Application", Handler_Class)
pythoncom.PumpMessages()

Теперь я пытаюсь расширить это, чтобы подключиться к событиям, которые отслеживают изменения категорий. У MSDN есть это по этому вопросу: https://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.olkcategory.aspx

Однако, когда я попробовал приведенный ниже код (с правильными именами из http://svn.cy55.de/changeset/1896?format=diff&new=1896), ничего не происходит:

class Handler_Class(object):
    def OnChange(self):
        print("Hook successful!")    

category = win32com.client.DispatchWithEvents("Outlook.OlkCategoryStrip", Handler_Class)
pythoncom.PumpMessages()

Кроме того, я не могу найти никакой документации по событиям, которые отслеживают, было ли электронное письмо перемещено в другую папку. Любые идеи??


person Vlad    schedule 11.07.2016    source источник


Ответы (1)


Интерфейс OlkCategory, на который вы ссылаетесь, привязан к элементу управления «Категории», используемому в областях формы Outlook; это бесполезно само по себе. Чтобы отслеживать изменения свойств (включая категории) элемента, необходимо подключиться к событию MailItem.PropertyChange: https://msdn.microsoft.com/en-us/library/ff866739.aspx.

Чтобы отслеживать добавление элемента в папку, необходимо перехватить событие Items.ItemAdd для любой заданной папки: https://msdn.microsoft.com/en-us/library/ff869609.aspx.

person Eric Legault    schedule 12.07.2016
comment
Привет, Эрик, спасибо, что вернулся. Пара вопросов: 1. Как подключиться к событию PropertyChange/ItemAdd? Я не думаю, что это так же просто, как добавить определение OnPropertyChange(self, name) в мой handler_Class выше? Нужно ли мне создавать новый DispatchWithEvents? 2. Могу ли я отследить, КТО изменил свойство/переместил предмет? - person Vlad; 13.07.2016
comment
Извините, я не знаю Python. Все, что я могу сказать, это то, что PropertyChange — это событие класса MailItem, а ItemAdd — свойство класса коллекции Items (полученное из свойства Items объекта Folder). Кто всегда будет текущим пользователем, который вы можете получить через свойство NameSpace.CurrentUser. - person Eric Legault; 13.07.2016
comment
Привет, так как бы вы подключились к этому событию в VBA? - person Vlad; 13.07.2016
comment
Объявите объект, на события которого вы хотите подписаться, в верхней части модуля или класса. Например. Dim WithEvents myMailItem как MailItem. В раскрывающемся списке myMailItem в среде IDE будут показаны все доступные события, и при выборе одного из них будет создана заглушка события. См.: msdn.microsoft.com/en-us/library/ff866235.aspx< /а> - person Eric Legault; 13.07.2016
comment
Привет, @EricLegault, моя текущая программа классифицирует входящие электронные письма по определенной категории в Outlook. Программа постоянно работает как cron или демон и классифицирует входящие электронные письма. Теперь, после того, как моя категоризация завершена, люди затем просматривают классифицированные электронные письма и изменяют категории, если программа неправильно классифицирует их. Я должен отслеживать и фиксировать это изменение в категории, что делается вручную. В моей текущей настройке я не могу интегрировать, как отслеживать это изменение, которое делается вручную. Пожалуйста, сообщите механизм для фиксации этого изменения. - person Rohan Amrute; 14.02.2017