listing Outlook emails by specific date in Python

16,783

Solution 1

Ive completed the code. Thanks for help.

`import sys, win32com.client, datetime
# Connect with MS Outlook - must be open.
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace
("MAPI")
# connect to Sent Items
s = outlook.GetDefaultFolder(5).Items   # "5" refers to the sent item of a 
folder
#s.Sort("s", true)
# Get yesterdays date for the purpose of getting emails from this date
d = (datetime.date.today() - datetime.timedelta (days=1)).strftime("%d-%m-%
y")
# get the email/s
msg = s.GetLast()
# Loop through emails
while msg:
    # Get email date 
    date = msg.SentOn.strftime("%d-%m-%y")
    # Get Subject Line of email
    sjl = msg.Subject
    # Set the critera for whats wanted                       
    if d == date and msg.Subject.startswith("xx") or msg.Subject.startswith
    ("yy"):
    print("Subject:     " + sjl + "     Date : ", date) 
    msg = s.GetPrevious() `

This works. However if no message according to the constraint if found, it doesnt exit. Ive tried break which just finds one message and not all, Im wondering if and how to do an exception? or if i try a else d != date it doenst work either (it will not find anything). I cant see that a For loop will work using a date with a msg(string). I not sure -- biginner here :) ??

Solution 2

The outlook API has a method, Items.Find, for searching the contents of .Items. If this is the extent of what you want to do, that's probably how you should do it.


Right now it seems like your if statement is checking whether set of emails is equal to yesterday.

Microsoft's documentation says .Items is returning a collection of emails which you first must iterate through using a few different methods including Items.GetNext or by referencing a specific index with Items.Item.

You can then take the current email and access the .SentOn property.

currentMessage = sent.GetFirst()
while currentMessage:
    if currentMessage.SentOn == y:
        sjl = currentMessage.Subject
        print(sjl)
    currentMessage = sent.GetNext()

This should iterate through all messages in the sent folder until sent.GetNext() has no more messages to return. You will have to make sure y is the same formatting as what .SentOn returns.

If you don't want to iterate through every message, you could probably also nest two loops that goes back in messages until it gets to yesterday, iterates until it is no longer within "yesterday", and then breaks.

Share:
16,783
Admin
Author by

Admin

Updated on June 04, 2022

Comments

  • Admin
    Admin almost 2 years

    I'm using Python 3. I'm trying to extract (list / print show) outlook emails by date.

    I was trying a loop.. maybe WHILE or IF statement.

    Can it be done since ones a string and the other is a date. Please concide what I've got so far: Thanks.

     1. import win32com.client, datetime
     2. 
     3. # Connect with MS Outlook - must be open.
     4. outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
     5. # connect to Sent Items
     6. sent = outlook.GetDefaultFolder(5).Items  # "5" refers to the sent item of a folder
     7. 
     8. # Get yesterdays date
     9. y = (datetime.date.today () - datetime.timedelta (days=1))
     10. # Get emails by selected date        
     11. if sent == y: 
     12.     msg = sent.GetLast()
     13.     # get Subject line
     14.     sjl = msg.subject
     14.     # print it out                      
     15.     print (sjl)