我想每隔一小时打破一次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)
答案 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&""))
。无论有没有,我的行为都没有区别。
让我知道