Моя цель - найти последнее электронное письмо, полученное от контакта. Список идентификаторов электронной почты находится в листе Google. Есть несколько почтовых идентификаторов, которые имеют 1000 электронных писем, а некоторые не имеют ни одного.
Я заметил, что когда код выполняется, для выполнения идентификатора электронной почты, который имеет 1000 электронных писем, требуется больше времени. , Поэтому подумайте о сокращении server.search
до периода по умолчанию 3 месяца, чтобы сократить время вычислений. Например, если в период по умолчанию, например, в течение 1-3 месяцев, электронное письмо не найдено, то его диапазон увеличится до 1-6 месяцев, если в нем не будет найдено электронных писем, оно увеличится до 1-9 месяцев и т. Д., вплоть до start_date = date(2016, 1, 1)
. Список дат содержится в since_date
Так что есть несколько вещей, которые я пытаюсь сделать, и мне нужна помощь с
Я пытаюсь найти способ изменить значение n
при наличии ошибки индекса. Это поможет мне создать новый since_date
. Я отметил это в коде, где n
и где происходит ошибка индекса
Диапазон n
должен быть = количество элементов, сгенерированных из length = len(list(daterange(start_date, end_date)))
(пометил его в коде)
Если достигнуто последнее значение 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']))