Después de investigar con expertos en el tema, programadores de varias ramas y profesores dimos con la solución a la cuestión y la dejamos plasmada en esta publicación.
Solución:
Entonces, si reinicia su secuencia de comandos de python cada vez que reinicia Outlook, agregue estas líneas a su código para verificar los correos electrónicos no leídos en su Bandeja de entrada:
ol = win32com.client.Dispatch( "Outlook.Application")
inbox = ol.GetNamespace("MAPI").GetDefaultFolder(6)
for message in inbox.Items:
if message.UnRead == True:
print message.Subject #or whatever command you want to do
Pon este código antes de tu definición de outlook
en tu código
EDITAR
Para mí, el código que publicaste funciona muy bien hasta que cierro Outlook y luego, incluso si lo vuelvo a abrir, no obtengo nada cuando recibo un nuevo mensaje (ver uno de mis comentarios). Supongo que el hecho de cerrar Outlook “desvincular” con pythoncom.PumpMessages()
. De todos modos, vengo a hacer tanto su verificación de correo electrónico no leído en la clase Handler_Class
y reinicie el monitoreo en caso de que reinicie Outlook.
import win32com.client
import ctypes # for the VM_QUIT to stop PumpMessage()
import pythoncom
import re
import time
import psutil
class Handler_Class(object):
def __init__(self):
# First action to do when using the class in the DispatchWithEvents
inbox = self.Application.GetNamespace("MAPI").GetDefaultFolder(6)
messages = inbox.Items
# Check for unread emails when starting the event
for message in messages:
if message.UnRead:
print message.Subject # Or whatever code you wish to execute.
def OnQuit(self):
# To stop PumpMessages() when Outlook Quit
# Note: Not sure it works when disconnecting!!
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
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 check_outlook_open ():
list_process = []
for pid in psutil.pids():
p = psutil.Process(pid)
# Append to the list of process
list_process.append(p.name())
# If outlook open then return True
if 'OUTLOOK.EXE' in list_process:
return True
else:
return False
# Loop
while True:
try:
outlook_open = check_outlook_open()
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)
pythoncom.PumpMessages()
# To not check all the time (should increase 10 depending on your needs)
time.sleep(10)
No estoy seguro de que sea la mejor manera, pero parece funcionar de la manera que buscas.
Agradecemos que desees añadir valor a nuestra información añadiendo tu experiencia en las reseñas.