Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@koshilife

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

More than 1 year has passed since last update.

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

参考

0
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  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
koshilife
スタートアップでサーバサイドエンジニアをやっています。 興味の赴くままにクラウド(GCP,AWS)、フロントエンドも齧っていきます。 最近は Zenn https://zenn.dev/koshilife を使っています。
waaq
日程調整自動化ツール waaq Linkを運営しています。「仕事に自由を。」をミッションに掲げたスタートアップです。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
0
Help us understand the problem. What is going on with this article?