Help us understand the problem. What is going on with this article?

Gmail API 過去1ヶ月分のメールを全て取得する (Ruby)

@koshi_life です。

Gmail APIでメールを取得する機会があり、過去メールの取得の仕方調べたので備忘します。

流れは、
1.messages:list APIを使って、対象のメッセージIDを取得し、
2.messages:get API を使い、メッセージIDのメール内容を取得する
の2ステップです。

※ スレッドID事に取得したいシーンは threads:listThread: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の存在有無確認で
次のデータの存在有無を確認している点ですかね。

参考

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away