0

ここの投稿と同様に、25,000 件以上のメールを分析しようとしています: http://beneathdata.com/how-to/email-behavior-analysis/

上記のスクリプトは IMAP を使用していましたが、セキュリティを強化するために Gmail API を使用してこれを実装しようとしています。私は Python (およびデータ分析用の Pandas) を使用していますが、質問はより一般的に Gmail API の使用に当てはまります。

ドキュメントから、次を使用してメールを読むことができます:

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 **

しかし、これは明らかに非常に遅いです。すべてのメッセージをループするだけでなく、list() API 呼び出しを何度も呼び出して、すべてのメールを循環する必要があります。

これを行うためのより高いパフォーマンスの方法はありますか? たとえば、すべての不要なメッセージ情報ではなく、データのみを返すように API に依頼します。

ありがとう。

参照: https://developers.google.com/resources/api-libraries/documentation/gmail/v1/python/latest/gmail_v1.users.messages.html

4

1 に答える 1

4

messages.get() 操作をバッチにバッチ処理できます 。https ://developers.google.com/gmail/api/guides/batch を参照してください。

バッチには最大 100 件のリクエストを入れることができます。

「まとめてバッチ処理された n 個のリクエストのセットは、1 回のリクエストとしてではなく、n 回のリクエストとして使用制限にカウントされます」ことに注意してください。そのため、リクエストのレート制限を下回るように、ペーシングを行う必要がある場合があります。

ID のリストで指定されたメッセージを取得する大まかな 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)
于 2017-10-07T00:20:34.773 に答える