Gmail API - быстрый доступ к датам каждого письма, когда-либо отправленного / полученного
Я пытаюсь проанализировать мои 25k+ писем, похожих на пост здесь: http://beneathdata.com/how-to/email-behavior-analysis/
В то время как упомянутый скрипт использовал IMAP, я пытаюсь реализовать это, используя Gmail API для повышения безопасности. Я использую Python (и Pandas для анализа данных), но этот вопрос более применим к использованию API Gmail.
Из документов я могу читать электронные письма, используя:
msgs = service.users().messages().list(userId='me', maxResults=500).execute()
а затем получить доступ к данным с помощью цикла:
for msg in msgs['messages']:
m_id = msg['id'] # get id of individual message
message = service.users().messages().get(userId='me', id=m_id).execute()
payload = message['payload']
header = payload['headers']
for item in header:
if item['name'] == 'Date':
date = item['value']
** DATA STORAGE FUNCTIONS ETC **
но это явно очень медленно. Помимо зацикливания каждого сообщения, мне приходится многократно вызывать API-интерфейс list () для циклического перебора всех электронных писем.
Есть ли более высокопроизводительный способ сделать это? например, попросить API вернуть только данные, а не всю нежелательную информацию сообщения.
Благодарю.
1 ответ
Вы можете объединить свои операции messages.get() в пакет, см. https://developers.google.com/gmail/api/guides/batch
Вы можете поместить до 100 запросов в пакет.
Обратите внимание, что "набор из n запросов, соединенных вместе, учитывает ваш лимит использования как n запросов, а не как один запрос". Так что вам может потребоваться сделать шаг, чтобы остаться ниже предела скорости запроса.
Вот грубый пример Python, который будет получать сообщения, представленные списком идентификаторов id_list
msgs = []
def fetch(rid, response, exception):
if exception is not None:
print exception
else:
msgs.append(response)
# Make a batch request
batch = gmail.new_batch_http_request()
for message_id in id_list:
t = gmail.users().messages().get(userId='me', id=message_id, format=fmt)
batch.add(t, callback=fetch)
batch.execute(http=http)