0

I am trying to read emails from my outlook for last 1 hour. I have used the below code. here i am not getting any error but it is not giving me any output.

import win32com.client
import datetime as dt
import pandas as pd

date_time = dt.datetime.now()

lastHourDateTime = dt.datetime.now() - dt.timedelta(minutes=60)

outlook = win32com.client.Dispatch("Outlook.Application").GetNameSpace("MAPI")
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items
messages.Sort("[ReceivedTime]", True)
message = messages.GetLast()
lastHourMessages = messages.Restrict("[ReceivedTime] >= '" + lastHourDateTime.strftime('%m/%d/%Y %H:%M %p') + "'")
timeStamp = dt.datetime.now().strftime("%d-%m-%Y_%H.%M.%S")

for lastHourMessage in lastHourMessages:
   print(lastHourMessage.subject)

I checked the len(messages), it is giving me total count of inbox mails. Whereas len(lastHourMessages) is showing as 0.

According to me, Restrict function is not working properly. Could anyone please help me?

PANDA
  • 137
  • 2
  • 9

1 Answers1

1

Change %y to %Y at line below.

lastHourMessages = messages.Restrict("[ReceivedTime] >= '" + lastHourDateTime.strftime('%m/%d/%y %H:%M %p') + "'")

Just to be sure, correct is

lastHourMessages = messages.Restrict("[ReceivedTime] >= '" + lastHourDateTime.strftime('%m/%d/%Y %H:%M %p') + "'")

UPDATE #1

I added some debug info in your code to help understand what going wrong.
Try to use code below. Hope, it will help you.

import win32com.client
import datetime as dt

one_hour_before = dt.datetime.now() - dt.timedelta(minutes=60)
print(f'one_hour_before: {one_hour_before.astimezone()}')

# Get Outlook NameSpace object.
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

# Get The Inbox folder.
# Other folder types:
#   https://learn.microsoft.com/en-us/office/vba/api/outlook.oldefaultfolders
inbox_folder = outlook.GetDefaultFolder(6)
print(f'{inbox_folder}\n')

# Get collection of Outlook items and sort.
messages = inbox_folder.Items
messages.Sort("[ReceivedTime]", True)

# Check all items and ReceivedTime.
for it, message in enumerate(messages):
  print(f'{it}\t{message.ReceivedTime} - {message.Subject}')

  # If recevied one hour before, print it.
  received_time = dt.datetime.utcfromtimestamp(message.ReceivedTime.timestamp())
  if received_time >= one_hour_before:
    print(f'^^^\tRECEIVED ONE HOUR BEFORE')

# Get items received one hour before, if there are.
one_hour_before_messages = \
  messages.Restrict( "[ReceivedTime] >= '"
                   + one_hour_before.strftime('%m/%d/%Y %H:%M %p')
                   + "'")

# Print them
if len(one_hour_before_messages) == 0:
  print('No items received one hour before.')
else:
  print('Items received one hour before:')
  for one_hour_before_message in one_hour_before_messages:
    print(f'{one_hour_before_message.ReceivedTime} \
- {one_hour_before_message.Subject}')

Result of code above:

one_hour_before: 2020-03-09 12:31:06.515809+09:00
受信トレイ

0       2020-03-09 13:19:04.102000+00:00 - RE: TEST
^^^     RECEIVED ONE HOUR BEFORE
1       2020-03-09 09:46:10.128000+00:00 - TEST
Items received one hour before:
2020-03-09 13:19:04.102000+00:00 - RE: TEST
Yeheshuah
  • 1,216
  • 1
  • 13
  • 28