Saltar al contenido

Cómo monitorear continuamente un correo nuevo en Outlook y correos no leídos de una carpeta específica en python

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *