LoginSignup
1
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-03-10

@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の存在有無確認で
次のデータの存在有無を確認している点ですかね。

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1