Доступ к электронной почте из определенной папки в Outlook в пределах определенного диапазона дат (пользовательский ввод) с использованием exchangelib в Python

Резюме требования: чтобы получить доступ к электронной почте из определенной папки в Outlook в пределах заданного пользователем диапазона дат,

пример: все письма за июнь или все письма с 23 июня 2020 г. по 15 июля 2020 г.

До сих пор мы пробовали следующее, но проблемы:

  1. Диапазон дат не дает правильного вывода
  2. Вывод занимает слишком много времени, а также иногда возвращается с ошибкой тайм-аута.

Код:

from exchangelib import Credentials, Account, DELEGATE, Configuration, IMPERSONATION, FaultTolerance,EWSDateTime,EWSTimeZone,Message
import datetime 
import pandas as pd


new_password = "your password"

credentials = Credentials(username = 'username', password = new_password)
config = Configuration(server ='outlook.office365.com', credentials = credentials)
account = Account(primary_smtp_address ='username', credentials = credentials, autodiscover = False, config = config, access_type = DELEGATE)

#first approach.....................................

conversation_id = []
datetime_received = []
has_attachment = []
Senders = []

for i in account.inbox.all().order_by('-datetime_received')[:40]:
    if isinstance(i, Message):
        if i.datetime_received:
            if ((i.datetime_received).year == 2020):
                if ((i.datetime_received).month == 7):
                        if i.conversation_id:
                            print("conversation id: ", i.conversation_id.id)
                            conversation_id.append(i.conversation_id.id)
                        if not i.conversation_id:
                            conversation_id.append("Not available")

                        if i.sender:
                            print("Sender name : ", i.sender.name)
                            Senders.append(i.sender.name)
                        if not i.sender:
                            Senders.append("not available")

                        if i.datetime_received:
                            print("Time : ", i.datetime_received.date)
                            datetime_received.append(i.datetime_received.date)
                        if not i.datetime_received:
                            datetime_received.append("not available")

                        if i.has_attachments:
                            print("Has attachment: ", i.has_attachments)
                            has_attachment.append(i.has_attachments)
                        if not i.has_attachments:
                            has_attachment.append("not available")
                    
                    

# second approach.....................................................................
items_for_2019 = account.inbox.filter(start__range=(
    tz.localize(EWSDateTime(2019, 8, 1)),
    tz.localize(EWSDateTime(2020, 1, 1))
)) 

for i in items_for_2019:
    print("")



#third approach.........................................................................

for item in account.inbox.filter(datetime_received__range=(tz.localize(EWSDateTime(2019, 8, 1)),tz.localize(EWSDateTime(2020, 1, 1)))):
    print(item.sender.name)

первый подход работает для определенного месяца, но очень медленно

второй и третий подход дают неверный результат

Небольшое руководство будет высоко оценено.


person Diptarka    schedule 29.07.2020    source источник


Ответы (1)


Поле start принадлежит CalendarItem. Это недопустимое поле для Message объектов. Вот почему ваш второй подход не работает.

Ваш третий подход должен работать. Какой результат вы видите, и что вы ожидали?

Если ваши запросы занимают много времени, попробуйте ограничить поля, которые вы выбираете для каждого элемента, используя метод .only() QuerySet.

person Erik Cederstrand    schedule 03.08.2020
comment
Привет @Erik, спасибо за ответ. Третий подход давал неверные данные, например, данные на выходе были вне диапазона того, что мы дали. - person Diptarka; 03.08.2020
comment
И, как видно из приведенного выше кода, я печатал только одно поле, то есть sender.name, но после долгой работы и выборки только 3–4 записей код выдавал ошибку тайм-аута сервера. Просто для справки, почтовые ящики, к которым я хочу получить доступ, содержат тысячи писем, из которых я хочу получать письма как минимум за 6 месяцев. - person Diptarka; 03.08.2020
comment
Мне трудно поверить, что третий подход возвращает элементы с datetime_received за пределами диапазона. Это хорошо проверенный путь кода. Если вы получаете тайм-ауты, попробуйте использовать .only() и настройте политику повторных попыток, если вы все еще видите тайм-ауты. - person Erik Cederstrand; 03.08.2020
comment
Привет, @Eric, проверю код с помощью .only() и вернусь к U. - person Diptarka; 04.08.2020
comment
Привет @Eric, я проверил код, он работает нормально. Большое спасибо за ответы и библиотеку. - person Diptarka; 05.08.2020