見出し画像

Gmail API を利用する-定期的に未読メールを既読にするツール-

みなさん、こんにちはこんばんは。S.Kと申します。
今回の記事はボリュームがあります。13000文字くらいですが、ソースコードが3割くらい占めてます。ソースコードって文字数ありますね。

注意:この記事は有料記事部分があります。

コトの発端

iPhoneのgmailアプリでは、gmailの未読メールがある場合に通知マークがつきます。

画像1

iPhoneの画面を見てると、どうしても気になるんですよね。
設定で消せますけど、未読は未読のままなので、どうにかならないものか?と考えたとき、GmailのAPIで解消できないか?例えば、
「10日くらい経っても未読のメールはどうせ読まないから既読にする」
こんな感じのツールが作れればいいなと思い、実際に作ってみました

なおPCのWebブラウザでも似たようなことはできます、小ネタとして記事の最後に記載します。

対象読者

今回はPythonで実装、説明します。

・Pythonで何か作ってみたい人
・GmailAPIを使ってみたい人
・OAuthの仕組みを理解したい人

必要なGoogleアカウント

・アプリ開発用のGoogleアカウント
・アプリの操作対象となるgmailのGoogleアカウント
 上記アプリ開発のものと同じでも異なっていても良いです。
 このgmailのアカウントのメールを未読から既読にします。

著者の環境

Mac環境です。今回はPythonで実装するのでWindowsでも同じです
自分の開発環境はEclipse+PyDevです。PydevはEclipse統合開発環境のプラグインです。Pythonのバージョンは3.6ですね。

開発環境はお好きなのを使っていただければ、と思います。僕はJavaでの開発で慣れ親しんだEclipse使ってます。

OAuthの仕組み

GmailAPIではOAuthと呼ばれる仕組みを使い認証、Gmailでの操作をします。
アプリケーションやツールからGmailユーザに対して
「●●したいんだけど、許可していただけますか?」
という伺いをし、ユーザが
「いいですよ」
と許可を出せば、そのアプリケーションからユーザの使うGmailに対して操作ができるようになります。

これは以下の記事がとてもわかりやすいです。

この記事の(31)から(39)の流れを覚えておいてください。
参考までに今回のGmailAPIでの認証を図示すると以下のようになります。大体で良いので認証の流れ、仕組みは頭に入れといてください。

Googleのアクセストークンやリフレッシュトークンの仕様は後述します。

■今回のイメージ図1:最初の許可とアクセストークンの取得

画像31

■今回のイメージ図2:アクセストークンでAPI利用

画像33

■今回のイメージ図3:アクセストークンの有効期限が切れた場合

画像32

Gmail APIを使う準備①:リファレンスを確認

■ APIのリファレンス

■ Python向けのリファレンス

この記事ではPythonで実行することを考えます。まず、丁寧にリファレンスを読んでいきましょう。

Gmail APIを使う準備②: 前提

Prerequisites
To run this quickstart, you'll need:
・Python 2.6 or greater
・The pip package management tool
A Google account with Gmail enabled

1つ目はPythonのバージョンが2.6以上であること
今回の記事ではPython3.xを利用します。
2つ目はpipが使えることです。これは普段からPython利用してれば使えるはずです。使えない場合は、以下の記事を参照したり、インターネットで調べてください。

3つ目はGmailAPIが有効になっている事です。 今回は開発する用のGoogleアカウントで、Google developers consoleにアクセスします。 

ライブラリをクリックします。

画像10

ライブラリで「gmail」で検索します。「Gmail API」をクリックします。

画像11

「有効にする」をクリックします。

画像12

以下のようになっていればAPIが有効になっています。

画像13

Gmail APIを使うステップ1

まず、以下にアクセスしてください。

Step 1: Turn on the Gmail API
Click this button to create a new Cloud Platform project and automatically enable the Gmail API:
   Enable the Gmail API
In resulting dialog click DOWNLOAD CLIENT CONFIGURATION and save the file credentials.json to your working directory.


(1)[Enable the Gmail API]をクリックします。

画像2

(2)以下の画面が表示されるので、適当なプロジェクト名をつけてください。

スクリーンショット 2020-11-22 20.37.37

(3)[NEXT]をクリックします。

画像4

(4)[Desktop app]が選択されてることを確認して[Create]をクリックします。

画像6

(5)Client IDClient Secretが表示されます。
ここで[DOWNLOAD CLIENT CONFIGURATION]をクリックし、credentials.jsonをダウンロードします。

画像6

ダウンロードされたcredentials.jsonは大切に管理してください。上記Client IDとClient Secretの情報が入ってます。

画像7

Gmail APIを使うステップ2

Google Client Libraryをお使いの環境にインストールします。

Step 2: Install the Google Client Library
Run the following command to install the library using pip:
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
See the library's installation page for the alternative installation options.

ちなみに私はPydevを使ってますので、Preferencesから[Python Interpreter]を選択して、使ってるPythonのバージョンを選択した上で、[Install/Unistall with pip]を使って以下のコマンドを叩いています。

画像9

画像14

画像14

Gmail APIを使うステップ3

Step 3: Set up the sample
Create a file named quickstart.py in your working directory and copy in the following code:

サンプルで確認します。
Pythonのサンプルをquickstart.pyとして保存し、ステップ1で取得したcredentials.jsonと同じフォルダにいれます。
コピーは以下でできます。

画像18

コピーしたものをquickstart.pyとして保存します。
私の環境で恐縮ですが、プロジェクトを作成し、以下のように配置しています。


画像16

quickstart.py

画像16

実行してみましょう。

Gmail APIサンプルの実行

実行するとコンソール上に以下のように表示され、ブラウザが立ち上がります。

画像19

画像20

今回の対象アカウントを選択します。上であればS Kのgmailアカウントです。すると以下のような注意画面が出ます。[詳細]をクリックします。

画像21

[XXX(安全ではないページ)に移動]をクリックします。

画像22

アプリ側がこのアカウントに対して操作をしていいかどうかの、確認画面が表示されます。[許可]をクリックします。

画像23

確認画面が出ます。問題がなければ、[許可]を選択してください。

画像24

すると、ブラウザ上には以下のメッセージが表示されます。

画像25

コンソール側に戻ると、ラベルの一覧が表示されると思います。

画像26

ちなみにブラウザでラベルを追加してみましょう。設定から[TESTAPI]というラベルを追加しました。

画像28

画像29

先ほどのプログラムを再度実行してみるとコンソール上にちゃんと表示されてます。なので、このメールアカウントの情報を取得できてることがわかります。

画像30

アクセストークン・リフレッシュトークンについて

いったん認証の許可がなされると、以下のようにtoken.jsonファイルが出来上がります。次回以降のアクセス・操作については、このtoken.jsonに書かれているアクセストークンを利用します。つまりブラウザでの認証が省略されます。

画像27

ただ、アクセストークンには有効期限(1時間)があります。
では、どうしてこの一度認証が済むとこのファイルだけでアクセス・操作ができたままなのでしょうか?
それはこのtoken.json内にリフレッシュトークンと呼ばれるものが記述されており、一定時間経ってアクセストークンの期限が切れると、このリフレッシュトークンを使ってアクセストークンを更新します。

リフレッシュトークンは、
・リフレッシュトークンを6ヶ月使用していない場合
・ユーザーがパスワードを変更した場合
・ユーザーが許可を取り消したりした場合
などに、無効になります。無効になった場合は、改めてブラウザからの認証が必要になります。詳しくは以下を参照ください。

完成版コード

さて、本題に入ります。
まず、完成版のコードを記載します。

ここから先は

9,277字 / 7画像

¥ 300

この記事が参加している募集

活動費、テキスト購入費に充てたいと思います。宜しくお願い致します。