0

PumpWaitingMessages を 1 時間ごとに中断し、未読メールがないかどうかを確認したいので、次のコードを試しました。

ただし、増加するtime.time()-starttime>10と、見通しがハングして進行できなくなります。次のエラーが発生することもあります。

これは、Python で Outlook の新着メールと特定のフォルダーの未読メールを継続的に監視する方法に関連しています。

 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)
4

1 に答える 1

0

したがって、次の場所で未読のメールを確認するに#Handler_Class.__init__(outlook)は:

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

(実際には割り当ては必要ありません)。しかし、残りの時間は受信メールを監視していて、同じことを実行できるため、コードのポイントがわかりませんpythoncom.PumpWaitingMessages()

Outlook に関する問題がハングしているため、何が問題なのかわからないため、数時間自分で実行しようとしましたが、うまくいきました。CPU の使用量を減らすために (コンピューターによってはこれが問題になる場合があります)、次のtime.sleep()ようにループに a を追加してみてください。

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

そして、私が答えてctypes.windll.user32.PostQuitMessage(0)いる間、あなたのコードにある両方がもう必要ではないと思います.pythoncom.PumpWaitingMessages()停止するために使用されていましたpythoncom.PumpMessages(). 有無にかかわらず、私は行動に違いはありませんでした。

お知らせ下さい

于 2018-04-19T15:09:52.837 に答える