Измените значение переменной, если есть ошибка индекса - PullRequest
0 голосов
/ 10 марта 2020

Моя цель - найти последнее электронное письмо, полученное от контакта. Список идентификаторов электронной почты находится в листе Google. Есть несколько почтовых идентификаторов, которые имеют 1000 электронных писем, а некоторые не имеют ни одного.

Я заметил, что когда код выполняется, для выполнения идентификатора электронной почты, который имеет 1000 электронных писем, требуется больше времени. , Поэтому подумайте о сокращении server.search до периода по умолчанию 3 месяца, чтобы сократить время вычислений. Например, если в период по умолчанию, например, в течение 1-3 месяцев, электронное письмо не найдено, то его диапазон увеличится до 1-6 месяцев, если в нем не будет найдено электронных писем, оно увеличится до 1-9 месяцев и т. Д., вплоть до start_date = date(2016, 1, 1). Список дат содержится в since_date

Так что есть несколько вещей, которые я пытаюсь сделать, и мне нужна помощь с

  1. Я пытаюсь найти способ изменить значение n при наличии ошибки индекса. Это поможет мне создать новый since_date. Я отметил это в коде, где n и где происходит ошибка индекса

  2. Диапазон n должен быть = количество элементов, сгенерированных из length = len(list(daterange(start_date, end_date))) (пометил его в коде)

  3. Если достигнуто последнее значение n, и оно все еще дает ошибку индекса. Затем print("no emails found"), а затем продолжайте с оставшимися идентификаторами электронной почты в списке.

Я даже не уверен, что это правильный подход к тому, что я пытаюсь сделать, потому что я полный новичок в кодировании и python. Пока что я создал код, проводя исследования и обучение в пути. Так что любая помощь приветствуется.

Ниже приведен весь код, выполняющий часть кода Gmail.

import email
from imapclient import IMAPClient
from datetime import timedelta, date, datetime


HOST = 'imap.gmail.com'
USERNAME = 'username'
PASSWORD = 'password'
ssl = True

## Connect, login and select the INBOX
server = IMAPClient(HOST, use_uid=True, ssl=ssl)
server.login(USERNAME, PASSWORD)
select_info = server.select_folder('INBOX')

## Date generator
def daterange(start_date, end_date):
    for n in range(int(start_date.day), int((end_date - start_date).days), 90):
        yield start_date + timedelta(n)

## Getting search date
start_date = date(2016, 1, 1)
end_date = date.today()
length = len(list(daterange(start_date, end_date))) #<----- 'n' should be = number of elements generated from this list
n = 5 #<---- Change this value if there is an Index error

for i, single_date in enumerate(daterange(start_date, end_date)):
    final_date = single_date.strftime("%Y-%m-%d")
    if i == length - n:
        since_date = datetime.strptime(final_date, '%Y-%m-%d') #<----- a since date is generated from 'n' value


##Search Inbox
messages = server.search(['FROM', 'email_i_want_to_search@gmail.com', 'Since', since_date])
response = server.fetch(messages, ['RFC822'])
last_msg_id = list(response.keys())[-1] #<----- This is where the Index Error happens
data = response[last_msg_id]
msg_string = data[b'RFC822']
msg = email.message_from_string(msg_string.decode())
print('ID %d: From: %s Date: %s' % (last_msg_id , msg['From'], msg['date']))
...