如何每隔一小时打破PumpWaitingMessages并检查任何未读邮件

时间:2018-04-18 12:00:03

标签: python subprocess win32com pythoncom

我想每隔一小时打破一次PumpWaitingMessages并检查是否有任何未读邮件,我尝试使用以下代码。

但是,如果我增加time.time()-starttime>10,那么我的前景悬而未决,有时我甚至无法得到以下错误:

这与How to continuously monitor a new mail in outlook and unread mails of a specific folder in python

有关
 pTraceback (most recent call last):
 File "final.py", line 94, in <module>
 outlook_open=processExists('OUTLOOK.EXE')
 File "final.py", line 68, in processExists
 print('process "%s" is running!' % processname)
 IOError: [Errno 0] Error

请检查代码并帮我解决此问题。

 import win32com.client
 import ctypes # for the VM_QUIT to stop PumpMessage()
 import pythoncom
 import re
 import time
 import os
 import subprocess
 import pyodbc

 class Handler_Class(object):

    def __init__(self):
      # First action to do when using the class in the DispatchWithEvents     
      outlook=self.Application.GetNamespace("MAPI")
      inbox=outlook.Folders['mymail@gmail.com'].Folders['Inbox']
      messages = inbox.Items
      print "checking Unread mails"
      # Check for unread emails when starting the event   
      for message in messages:
         if message.UnRead:
           print message.Subject.encode("utf-8") # Or whatever code you wish to execute.
           message.UnRead=False

    def OnQuit(self):
       # To stop PumpMessages() when Outlook Quit
       # Note: Not sure it works when disconnecting!!
       print "Inside handler onQuit"
       ctypes.windll.user32.PostQuitMessage(0)

    def OnNewMailEx(self, receivedItemsIDs):
      # RecrivedItemIDs is a collection of mail IDs separated by a ",".
      # You know, sometimes more than 1 mail is received at the same moment.
      for ID in receivedItemsIDs.split(","):
          mail = self.Session.GetItemFromID(ID)
          subject = mail.Subject
          print subject.encode("utf-8")
          mail.UnRead=False
          try: 
            command = re.search(r"%(.*?)%", subject).group(1)
            print command # Or whatever code you wish to execute.
          except:
            pass

 # Function to check if outlook is open
 def processExists(processname):
   tlcall = 'TASKLIST', '/V', '/FI', 'imagename eq %s' % processname
   # shell=True hides the shell window, stdout to PIPE enables
   # communicate() to get the tasklist command result
   tlproc = subprocess.Popen(tlcall, shell=True, stdout=subprocess.PIPE)
   # trimming it to the actual lines with information
   tlout = tlproc.communicate()[0].strip().split('\r\n')
   # if TASKLIST returns single line without processname: it's not running
   if len(tlout) > 1 and processname in tlout[-1]:
      if "Not Responding" in tlout[2]:
         print('process "%s" is not responding' % processname)
         os.system("taskkill /f /im  outlook.exe")
         return False
      print('process "%s" is running!' % processname)
      return True
   else:
      print('process "%s" is NOT running!' % processname)
      return False

# Loop 
while True:
  try:
     outlook_open = processExists('OUTLOOK.EXE') 
  except: 
     outlook_open = False
  #If outlook opened then it will start the DispatchWithEvents
  if outlook_open == True:
     outlook = win32com.client.DispatchWithEvents("Outlook.Application", Handler_Class)
     while True:
         starttime=time.time()
         while (int(time.time()-starttime)<10):
             pythoncom.PumpWaitingMessages()    
         ctypes.windll.user32.PostQuitMessage(0)     
         outlook_open=processExists('OUTLOOK.EXE')
         if outlook_open == False:
             break
         #Handler_Class.__init__(outlook)
         # To not check all the time (should increase 10 depending on your needs)
  if outlook_open == False:
     print "outlook not opened"
     os.startfile("outlook")
  time.sleep(10)

1 个答案:

答案 0 :(得分:0)

所以,请在#Handler_Class.__init__(outlook)地点检查您的未读电子邮件:

win32com.client.DispatchWithEvents("Outlook.Application", Handler_Class)

(真的不需要任务)。但是我没有在代码中看到这一点,因为其余时间您使用pythoncom.PumpWaitingMessages()监视传入的电子邮件,并且可以执行相同的操作。

因为你的问题是悬挂,不知道是什么问题,我尝试自己运行几个小时,它的工作原理。也许是为了减少一些CPU的使用(这可能是你的问题,具体取决于你的计算机),你可以尝试在循环中添加time.sleep(),例如:

while (int(time.time()-starttime)<100):
    pythoncom.PumpWaitingMessages()
    time.sleep(0.1)

在我回答的同时,我认为ctypes.windll.user32.PostQuitMessage(0)不再需要pythoncom.PumpWaitingMessages()代码中的pythoncom.PumpMessages(),而是用来停止=SUMPRODUCT((LEFT(A2:A99)="J")/COUNTIF(A2:A99,A2:A99&"")) 。无论有没有,我的行为都没有区别。

让我知道