Python - Outlook ищет электронные письма только в определенном диапазоне - PullRequest
0 голосов
/ 08 октября 2019

Прямо сейчас у меня есть некоторый код, который ищет во входящих сообщениях электронной почты с вложениями между двумя датами, указанными пользователем, и сохраняет вложения в папке. Существует также словарь, чтобы смотреть только на определенных отправителей. Идея состоит в том, чтобы запустить скрипт и получить ожидаемые вложения без необходимости искать их в папке входящих сообщений. Проблема в том, что, даже если я укажу диапазон в один день, он будет искать весь почтовый ящик. Он не получает вложения за пределами диапазона, поэтому программа делает то, что мне нужно, но поиск по всему входному почтовому ящику занимает больше времени, чем нужно.

У меня такое ощущение, что проблема в том, что я начинаю с 'for msgв обратном (itcontents): '- itcontents - это имя, которое я дал почтовому ящику, которое, как мне кажется, говорит python, чтобы оно просматривало весь почтовый ящик, и ничто не говорит ему о том, чтобы он прекратил поиск после прохождения даты, определенной в searchRange.

####Code to determine search range by date
check = 0
todayDate = datetime.date.today()
startDate = input("Enter a date dd-mm-yyyy: ")
if startDate == "":
        startDate = input("Enter a date dd-mm-yyyy: ")
startDate = datetime.datetime.strptime(startDate, "%d-%m-%Y") #class and module are called datetime hence datetime.datetime.strptime
searchRange = int(input("Enter how many before that date to search: "))
searchDate = startDate.date() - datetime.timedelta(days = searchRange)
###use msg.SentOn.date() >= searchDate to search emails on or after the date determined by searchRange 


print("Your search starts from", startDate, "and ends on", searchDate)

#####Code to check emails.
for msg in reversed(itcontents): #reversed() will go from most recent to oldest email

        if msg.Class == 43: #avoid attribute error for non mail-item objects
                try:
                        if (str(msg.SenderEmailAddress) or str(msg.SentOnBehalfOfName)) in senderDict and (msg.SentOn.date() >= searchDate and msg.SentOn.date() <= startDate.date()):
                                check += 1
                                print(check, "messages from", msg.SenderEmailAddress) #keep count of messages checked
                                for x in msg.Attachments:
                                        if str(".pdf").casefold() in str(x): #casfold() for upper or lower case combinations
                                                #x refers to the attachment
                                                x.SaveAsFile(r"C:\Users\...\Desktop\Invoices from Outlook\\" + str(msg.SenderEmailAddress) + x.FileName)
                                                print("Saved attachment", x, "from", str(msg.Sender()), "on", str(msg.SentOn.date()))


                except UnicodeEncodeError: #unsupported characters
                        print("Subject line could not be parsed.")
                        #continue
                except AttributeError:
                        print("Attribute error for item on", msg.SentOn.date())
                        #continue

input("Press any key to exit.")

Вывод выглядит как

Enter a date dd-mm-yyyy: 10-09-2019
Enter how many before that date to search: 7
Your search starts from 2019-09-10 00:00:00 and ends on 2019-09-03
1 messages from senderaddress.com
Saved attachment Invoice INV-001142.pdf from senderaddress.com on 2019-09-09
2 messages from senderaddress.com
3 messages from senderaddress.com
Saved attachment invoice287163401.pdf from senderaddress.com on 2019-09-04
4 messages from senderaddress.com
Saved attachment Invoice 450013144.pdf from senderaddress.com on 2019-09-03
5 messages from senderaddress.com
Press any key to exit.

'Нажмите любую клавишу для выхода.'появится через некоторое время после прохождения всей папки входящих сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...