Попробуйте использовать Dispatch
вместо DispatchEx
и GetSharedDefaultFolder
вместо Inbox
. Следующий код правильно регистрирует входящие электронные письма в общую папку «Входящие»:
import ctypes # for the VM_QUIT to stop PumpMessage()
import pythoncom
import win32com.client
import sys
# outlook config
SHARED_MAILBOX = "Your Mailbox Name"
# get the outlook instance and inbox folder
session = win32com.client.Dispatch("Outlook.Application").Session
user = session.CreateRecipient(SHARED_MAILBOX)
shared_inbox = session.GetSharedDefaultFolder(user, 6).Items # 6 is Inbox
class HandlerClass(object):
def OnItemAdd(self, item):
print("New item added in shared mailbox")
if item.Class == 43:
print("The item is an email!")
outlook = win32com.client.DispatchWithEvents(shared_inbox, HandlerClass)
def main():
print("Starting up Outlook watcher")
pythoncom.PumpMessages()
if __name__ == "__main__":
try:
status = main()
sys.exit(status)
except KeyboardInterrupt:
print("Terminating program..")
ctypes.windll.user32.PostQuitMessage(0)
sys.exit()
EDIT:
В моем коде, опубликованном выше, есть ошибка, и хотя она не является частью вопроса, я не хочу ее так оставлять. Программа не будет ловить KeyboardInterrupt
, как это, потому что PumpMessages
является бесконечным циклом, который блокирует основной поток. Помещение его в собственный поток с помощью модуля threading
позволяет обойти это:
class OtlkThread(threading.Thread):
def run(self):
logger.info("Starting up Outlook watcher\n"
"To terminate the program, press 'Ctrl + C'")
pythoncom.PumpMessages()
def main():
win32com.client.DispatchWithEvents(shared_inbox, HandlerClass)
OtlkThread(daemon=True).start()
if __name__ == "__main__":
status = main()
while True:
try:
time.sleep(1)
except KeyboardInterrupt:
logger.info("Terminating program..")
ctypes.windll.user32.PostQuitMessage(0)
sys.exit(status)