1

is it possible to trigger some action when a new mail arrives in outlook using the python module win32com

pseudocode

 while 1
        if a mail arrives
            do x

Edit: I'm not allowed to use "run script" rule

2 Answers 2

4

Use DispatchWithEvents function for Outlook NewMailEx event

Example

import pythoncom
from win32com.client import DispatchWithEvents


# Event handler class for Outlook events
class OutlookEventHandler(object):
    @staticmethod
    def OnNewMailEx(EntryIDCollection):
        for ID in EntryIDCollection.split(","):
            item = Outlook.Session.GetItemFromID(ID)
            # check item class, 43 = MailItem
            if item.Class == 43:
                print(" Subj: " + item.Subject)


if __name__ == "__main__":
    Outlook = DispatchWithEvents("Outlook.Application", OutlookEventHandler)
    olNs = Outlook.GetNamespace("MAPI")
    Inbox = olNs.GetDefaultFolder(6)
    pythoncom.PumpMessages()

Items.ItemAdd event (Outlook)

Example

import pythoncom
from win32com.client import DispatchWithEvents, Dispatch


# Event handler class for outlook events
class OutlookEvent(object):
    @staticmethod
    def OnItemAdd(item):
        """ Name    Required/Optional   Data type   Description
            Item    Required            Object      The item that was added."""
        print(f'The item that was added = {item.Subject}')


if __name__ == "__main__":
    outlook = Dispatch("outlook.Application")
    olNs = outlook.GetNamespace("MAPI")
    inbox = olNs.GetDefaultFolder(6)

    event = DispatchWithEvents(inbox.Items, OutlookEvent)
    pythoncom.PumpMessages()
Sign up to request clarification or add additional context in comments.

2 Comments

This is the way to do it. One variation is to use win32com.gencache.EnsureDispatch() then WithEvents() as a separate call. This will cause gen_py to create the constants, so you can write win32com.client.constants.olMail rather than 43. Would then also need to cast item using CastTo(IMailItem) with this approach. A side-effect is that it also enforces case-sensitivity on methods/properties, which can prevent unexpected behaviour down the line.
0

You can create a rule that runs a VBA script. That script can do anything you want it to do, including running your Python code.

2 Comments

I'm not allowed to use the "run script" rule
Then your only option is to track the Application.NewMailEx event either from an external app or from a COM/VSTO addin (no Python).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.