@koshi_life です。
Gmail APIでメールを取得する機会があり、過去メールの取得の仕方調べたので備忘します。
流れは、
1.messages:list APIを使って、対象のメッセージIDを取得し、
2.messages:get API を使い、メッセージIDのメール内容を取得する
の2ステップです。
※ スレッドID事に取得したいシーンは threads:list、Thread:get で取得が良さげ。
サンプルコード (Ruby)
fetch_gmail.rb
# 指定のクエリでメッセージID一覧を返却します。
#
# client: Google::Apis::GmailV1::GmailService
# query: Gmail search operators refer to https://support.google.com/mail/answer/7190
def get_all_messages(client, query, max_results = 100)
messages = []
next_page_token = nil
loop do
if next_page_token.present?
result = client.list_user_messages('me', q: query, max_results: max_results, page_token: next_page_token)
else
result = client.list_user_messages('me', q: query, max_results: max_results)
end
messages += result.messages if result.messages.present?
# result.next_page_token が存在していたら次のデータ有り
next_page_token = result.next_page_token
break if next_page_token.blank?
end
messages
end
# 過去1ヶ月分の全メールを取得し、`do_something`をコールします。
#
# client: Google::Apis::GmailV1::GmailService
def main(client)
query = 'newer_than:1m' # クエリ: 直近1ヶ月分
messages = get_all_messages(client, query)
messages.each do |msg|
# メール取得
gmail = client.get_user_message('me', msg.id)
#
# do_somthing(gmail)
#
end
end
例外処理と get_all_messages
内のresult.messages
が大量データを扱う時、メモリ占有率など気になりましたが、サンプルコードのため考慮していません。
コード内のポイントとしては、メッセージID一覧取得する
get_all_messages
内でresult.next_page_token
の存在有無確認で
次のデータの存在有無を確認している点ですかね。