Python проблемы с указанным c адресом электронной почты Outlook - PullRequest
0 голосов
/ 05 мая 2020

Кто-нибудь может дать мне совет по этому вопросу? Я не получаю сообщений об ошибках и не знаю, с чего начать.

Я создал программу, которая проверяет электронные письма в папке входящих сообщений Outlook на наличие вложений в формате PDF из списка отправителей, а затем сохраняет вложения в папка. Вы вводите дату начала и выбираете, сколько дней вы хотите искать. В коде есть строка, показывающая все проверяемые электронные письма, даже если они не связаны с отправителями для отладки. Он работал нормально в течение нескольких месяцев, до недавнего времени я получил электронное письмо от ebay, которое содержало эмоцию упакованной картонной коробки в строке темы, и это конкретное письмо c приводит к неправильному поведению программы.

Вот пример ошибочного вывода - я ввел ноль для поиска «любого отправителя» из списка и выбрал диапазон дат, как всегда. Первая ошибка атрибута вызвана недоставленным сообщением (которое Outlook не считает «почтой» класса 43). Вы можете видеть, что проверяется первый обычный почтовый элемент в диапазоне дат, отображается строка темы et c, но затем следующее сообщение - это электронное письмо ebay, которое выходит за пределы диапазона дат. Программа пропускает несколько дней без проверки других писем в этом диапазоне и завершает поиск. То же самое произойдет, если я отключу отображение каждого электронного письма на выходе (все электронные письма по-прежнему читаются программой, но есть строка для отображения только соответствующих).

Кажется, есть некоторая проблема с этим c электронная почта - Ebay не является одним из отправителей в списке, который программа проверяет на наличие вложений, и даже если у меня есть диапазон дат, равный нулю дней, он все равно будет показывать это электронное письмо с недели go в качестве последнего проверенного электронного письма. . Единственное, что кажется уникальным в нем, - это эмоция картонной коробки в строке темы, в ней нет ничего особенного.

Вот результат:

Choose a sender (blank to exit): 0
Enter a starting search date in format dd-mm-yyyy (blank to exit): 05-05-2020
Enter how many days previous to search through: 3
Your search starts from 2020-05-05 00:00:00 and ends on 2020-05-02

Searching for any sender
Searching...
Attribute error (not class 43 mail) for item at mainChoice0() - .MessageClass REPORT.IPM.Note.NDR - Class 46
Looking at [...], WordPress has been updated on [...]. 2020-05-05
Looking at ? ORDER DELIVERED: 10x Capacitive Stylus Pen Tou… 2020-04-28
Reached end of date range: final message - ? ORDER DELIVERED: 10x Capacitive Stylus Pen Tou… 2020-04-28

Если я перенесу проблемное письмо c в другой почтовый ящик, моя программа будет правильно проверять электронные письма во всем диапазоне дат, который я ввел. электронное письмо ebay, то оно НЕ отображается в выводе, в то время как ДРУГИЕ электронные письма ebay, которые включают эмоции, такие как грузовик или отмеченный флажок, ДОЛЖНЫ проверяться программой.

Looking at ? ORDER UPDATE: 10x Capacitive Stylu... 2020-04-22
Looking at FAILED Schemus mail synchronization 2020-04-22
Attribute error (not class 43 mail) for item at mainChoice0() - .MessageClass REPORT.IPM.Note.NDR - Class 46
Attribute error (not class 43 mail) for item at mainChoice0() - .MessageClass REPORT.IPM.Note.NDR - Class 46
Looking at Active Directory Sync Failure 2020-04-21
Looking at ✅ ORDER CONFIRMED: 10x Capacitive Stylu... 2020-04-21

Ниже представлен блок кода для сбора навесное оборудование:

def mainChoice0(): #COLLECT ATTACHMENTS
        #Choose sender from menu.
        senderNum = input("Choose a sender (blank to exit): ")
        if senderNum == "":
            mainChoiceDisplay0 = False
            topMenu() #Return to main menu
        else:
            senderNum = int(senderNum)

        senderChoice = listSender[senderNum]

        ####Determine search range by date
        startDate = input("Enter a starting search date in format dd-mm-yyyy (blank to exit): ")
        if startDate == "":
            mainChoiceDisplay0 = False
            topMenu()

        #strptime will convert startDate from a string to a usable date
        startDate = datetime.datetime.strptime(startDate, "%d-%m-%Y") 
        searchRange = int(input("Enter how many days previous to search through: "))
        searchDate = startDate.date() - datetime.timedelta(days = searchRange)
        print("Your search starts from", startDate, "and ends on", searchDate, "\n")

        #SEARCH ANY SENDERS
        if senderNum == 0:
            print("Searching for any sender")
            print("Searching...")

        #LOOK AT INBOX CONTENTS
            for msg in reversed(itcontents): #reversed() looks at most recent received email first based on date

                #while mainChoiceDisplay0 == True:

                    try:

                        ###!!! uncomment this to see details about every email even if they aren't relevant to the search  !!!####
                        print("Looking at", msg, msg.SentOn.date()) 

                        #msg.Sender is sender name, msg.SenderEmailAddress is the address.
                        if ( (str(msg.SenderEmailAddress) or str(msg.Subject) or str(msg.Sender) 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, "on", msg.SentOn.date()) #show number of messages from relevant senders


                            for x in msg.Attachments:
                                if str(".pdf").casefold() in str(x): #casefold() checks upper or lower case combinations e.g PDF pdf Pdf
                                    x.SaveAsFile("C:\\Users\\"+emailUser+"\\Desktop\\Invoices from Outlook\\" + str(msg.SentOn.date()) + str(msg.SenderEmailAddress) + x.FileName)
                                    print("Saved attachment", x, "from", str(msg.Sender()), "on", str(msg.SentOn.date()))
                                    #break
                                    #Stop searching inbox earlier than searchDate

                        nextMail() #Look at the next most recent email, repeat until end of date range

                        #Final message to indicate end of search, with subject line and date of the final message.
                        if msg.SentOn.date() < searchDate:
                            print("Reached end of date range: final message -", msg, msg.SentOn.date(), "\n")
                            mainChoiceDisplay0 = False
                            topMenu()

                    except UnicodeEncodeError: #unsupported characters
                        print("Subject line could not be parsed", msg, msg.SentOn.date())
                        #continue

                    except OverflowError: #caused by invalid or very old date e.g 01-01-0000
                        print("Date calculation caused an overflow error, possibly because you entered a very old date e.g 01-01-0000 at mainChoice0()")
                        #break

                    except AttributeError: #The email was the wrong class for the attribute msg.Sender or you tried to use an attribute that doesn't work for that method
                        print("Attribute error (not class 43 mail) for item at mainChoice0() - .MessageClass", msg.MessageClass, '- Class', msg.Class)
                        pass

                    except ValueError:
                        print("Invalid input caused a value error in mainChoice0().")

1 Ответ

1 голос
/ 05 мая 2020

Вместо перебора всех элементов и проверки каждого отдельного свойства каждый раз, когда вам нужно использовать методы Find / FindNext или Restrict класса Items. Дополнительные сведения об этих методах см. В следующих статьях:

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