Search code examples
pythonparsingoutlook

How to make a time restriction in outlook using python?


I am making a program that:

  • opens outlook
  • find emails per subject
  • extract some date from emails (code and number)
  • fills these data in excel file in.

Standard email looks like this:

Subject: Test1

 Hi,
 You got a new answer from user Alex. 

 Code: alex123fj
 Number1: 0611111111
 Number2: 1020
 Number3: 3032

I encounter 2 main problems in the process. Firstly, I do not get how to make time restriction for emails in outlook. For example, if I want to read emails only from yesterday. Secondly, all codes and numbers from email I save in lists. But every item gets this ["alex123fj/r"] in place from this ["alex123fj"]

I would appreciate any help or advice, that is my first ever program in Python.

Here is my code:

import win32com.client
import re

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.Folders('myemail@....').Folders('Inbox')

messages = inbox.Items

def get_code(messages):
     codes_lijst = []
     for message in messages:
        subject = message.subject
        if subject == "Test1":
           body = message.body
           matches = re.finditer("Code:\s(.*)$", body, re.MULTILINE)
           for match in matches:
            codes_lijst.append(match.group(1))
        return codes_lijst


def  get_number(messages):
numbers_lijst = []
for message in messages:
    subject = message.subject
    if subject == "Test1":
        body = message.body
        matches = re.finditer("Number:\s(.*)$", body, re.MULTILINE)
        for match in matches:
            numbers_lijst.append(match.group(1))
return numbers_lijst


code = get_code(messages)
number = get_number(messages)

print(code)
print(number)

Solution

  • Firstly, never loop through all items in a folder. Use Items.Find/FindNext or Items.Restrict with a restriction on ConversationTopic (e.g. [ConversationTopic] = 'Test1').

    To create a date/time restriction, add a range restriction ([ReceivedTime] > 'some value') and [ReceivedTime] < 'other value'