如何在python中连续监视Outlook中特定文件夹的Outlook和未读邮件中的新邮件

我想检查特定的发件人电子邮件,并在它到达的任何地方自动处理

但是,可能会出现我的Outlook重新开始的情况,这意味着我收到发件人的邮件并标记为未读

为了连续监控特定主题的新邮件,我找到了以下代码

import win32com.client
import pythoncom
import re

class Handler_Class(object):
  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 = outlook.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


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

#and then an infinit loop that waits from events.
pythoncom.PumpMessages() 

即使我想查看所有未读邮件,也要检查来自发件人的邮件是否已经过来并处理它(如果找到)

是否有任何函数可以检查要在handler_class中添加的未读邮件

或者让我知道任何替代程序

解决方法:

因此,如果每次重新启动Outlook时重新启动python脚本,请将这些行添加到代码中以检查收件箱中未读的电子邮件:

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

将此代码放在代码中定义outlook之前

编辑

对我来说,你发布的代码很有效,直到我关闭Outlook,然后即使我重新打开它,收到新消息时我也没有得到任何东西(参见我的评论之一).我猜想用pythoncom.PumpMessages()关闭Outlook“unlink”的事实.无论如何,我在Handler_Class类中检查未读电子邮件,并在重新启动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)

不确定这是最好的方式,但它似乎以您寻找的方式工作.

上一篇:python – Windows身份验证代码现在不再有效


下一篇:使用Python从Excel到PowerPoint的图表