業務でGmailを活用している場面は多いことだろう。今回は、Pythonを利用してGmailのメールを確認する方法を紹介する。Googleは開発社向けに、さまざまなAPIを公開しており、Gmailを操作するAPIもその一つだ。GmailをPythonで処理できれば便利な場面も多い。今回は、Gmail APIを使うための設定を行い、簡単な新着メールの要約を表示するところまでを紹介しよう。

PythonでGmailを扱う三つの方法

さて、最初に、PythonでGmailの受信を行う手順を確認しておこう。PythonでGmailを表示する方法には、三種類の方法がある。一つは、Googleが公開しているAPIを経由してメールを操作する方法、二つ目は、電子メールの汎用的なプロトコルIMAPを使う方法、そして、三つ目は、同じく汎用的なプロトコルであるPOP3を使う方法だ。

実は、三つ目のPOP3を使う方法が最も簡単なのだが、現在セキュリティ的な観点から推奨されていない。と言うのも、GmailでPOP3を利用するには、セキュリティ設定を弱に変更しなければならないようになっている。

そこで、今回は、一つ目のGoogleが提供するAPIを利用してGmailを操作する方法を紹介しよう。Google APIを利用する方法を使えば、メールの送受信に加えて、ラベル情報を参照したりと、Gmailの機能をフルに活用できるのが良いところだ。

PythonでGmailを確認するまでのステップ

ただし、GoogleのAPIを利用するには、Googleの開発者用のサイト(Google APIs)にアクセスして、Gmail APIを利用できるように設定を変更する必要がある。Googleが提供するAPIは、OAuthの仕組みで提供される。そのため、ここがポイントとなる点だが、開発者はAPIを利用したアプリのための認証情報と、アプリを利用するユーザーのための認証情報の二つの認証が必要になる。

なお、OAuthについては、本連載の16回目「PythonからGoogleドライブを操作しよう( https://news.mynavi.jp/article/zeropython-16/ )」で紹介しているので、そちらも参考になるだろう。

Gmail APIを使うためには、以下の手順で操作を行おう。
・(1) Googleの開発者コンソールにログインしてGmail APIを有効にする
・(2) プロジェクトおよび認証情報を作成し設定ファイルをダウンロード
・(3) Gmailを利用するユーザーのアカウントで認証を行う
・(4) ユーザーの認証情報を元に、Gmailの各種APIを使う

(1) Googleの開発者コンソールにログインしてGmail APIを有効にする

まずは、Gmail APIを有効にするために、以下のGoogleの開発者サイトへアクセスして、ログインしよう。そして、プロジェクトを作成するか、既存のプロジェクトを選択しよう。

- 開発者コンソールでGmail APIを有効にする - [URL] https://console.developers.google.com/flows/enableapi?apiid=gmail
  • 開発者コンソールでGmail APIを有効にしよう

    開発者コンソールでGmail APIを有効にしよう

(2) 認証情報を作成し設定ファイルをダウンロード

すると、Gmail APIが有効になる。すると画面に表示される「認証情報に進む」のボタンをクリックして、認証情報を作成しよう。(あるいは、Google APIsの画面左側にある「認証情報」をクリックしよう。)

  • 認証情報を作成しよう

    認証情報を作成しよう

そして、APIを呼びだす場所を「その他のUI (Windows、CLIツールなど)」と指定し、また、アクセスするデータの種類を「ユーザーデータ」と指定しよう。そして「必要な認証情報」のボタンをクリックする。

  • APIを呼びだす場所とデータの種類を指定しよう

    APIを呼びだす場所とデータの種類を指定しよう

続いて、OAuth2.0クライアントの名前を適当に指定して、「クライアントIDの作成」ボタンをクリック。

  • クライアントIDを指定

    クライアントIDを指定

「OAuth2.0同意画面を設定する」でメールアドレスとサービス名を指定して「次へ」のボタンをクリック。

  • 同意画面を設定する

    同意画面を設定する

続いて、認証情報をダウンロードしよう。「ダウンロード」ボタンをクリックすると、ファイル「client_id.json」がダウンロードできる。もし、ダウンロードしたファイルが異なるファイル名になってしまったら、ファイル名を変更しておこう。ダウンロードしたら「完了」ボタンをクリックしよう。

(3) ユーザー認証を実行しよう

ここから、Pythonのプログラムを作っていこう。まずは、Pythonのプログラムを動かすのに際して、「google-api-python-client」モジュールをインストールしよう。

コマンドラインを起動して、以下のコマンドを実行しよう。コマンドラインは、WindowsのAnaconda環境であれば、「Anacondaプロンプト」、macOSであれば「ターミナル.app」を起動してコマンドを実行しよう。

 # google-api-python-clientをインストール
 $ pip install --upgrade google-api-python-client

そして、モジュールのインストールが完了したら、以下のプログラムを「gmail_auth.py」という名前で保存しよう。

 import httplib2, os
 from apiclient import discovery
 from oauth2client import client
 from oauth2client import tools
 from oauth2client.file import Storage

 # Gmail権限のスコープを指定
 SCOPES = 'https://www.googleapis.com/auth/gmail.readonly'
 # ダウンロードした権限ファイルのパス
 CLIENT_SECRET_FILE = 'client_id.json'
 # ユーザーごとの設定ファイルの保存パス
 USER_SECRET_FILE = 'credentials-gmail.json'

 # ユーザー認証データの取得
 def gmail_user_auth():
     # ユーザーの認証データの読み取り
     store = Storage(USER_SECRET_FILE)
     credentials = store.get()
     # ユーザーが認証済みか?
     if not credentials or credentials.invalid:
         # 新規で認証する
         flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
         flow.user_agent = 'Python Gmail API'
         credentials = tools.run_flow(flow, store, None)
         print('認証結果を保存しました:' + USER_SECRET_FILE)
     return credentials

 # 認証実行
 gmail_user_auth()

ただし、このプログラムは、Jupyter Notebookから実行できないので、コマンドラインから実行しよう。

そのため、Jupyter Notebookの実行ディレクトリ(一般的には、ユーザーのディレクトリ)に、先ほどダウンロードした「client_id.json」と、このプログラムをコピーしたら、コマンドラインから以下のように実行しよう。

 $ python gmail_auth.py

プログラムを実行すると、Webブラウザが起動し、ログインフォームが表示されるので、Gmailアカウントを入力してログインしよう。すると、以下のような許可を求める画面が出るので「許可」のボタンをクリックしよう。

  • ブラウザが表示されたらログインして許可しよう

    ブラウザが表示されたらログインして許可しよう

(4) Gmailの各種APIを使う

ここまでの手順がうまくいっていれば、「credentials-gmail.json」というファイルが同じディレクトリにできているはずだ。ここで、Jupyter Notebookを起動しよう。Jupyter Notebookが先に起動していたら、一度終了して起動し直す必要がある。

  • Jupyter Notebookを起動しよう

    upyter Notebookを起動しよう

その上で、新規ノートブックを作成し、以下のプログラムを書き込んで実行してみよう。

 import httplib2, os
 from apiclient import discovery
 import gmail_auth # 先ほど作成したプログラム

 # Gmailのサービスを取得
 def gmail_get_service():
     # ユーザー認証の取得
     credentials = gmail_auth.gmail_user_auth()
     http = credentials.authorize(httplib2.Http())
     # GmailのAPIを利用する
     service = discovery.build('gmail', 'v1', http=http)
     return service

 # メッセージの一覧を取得
 def gmail_get_messages():
     service = gmail_get_service()
     # メッセージの一覧を取得
     messages = service.users().messages()
     msg_list = messages.list(userId='me', maxResults=10).execute()

     # 取得したメッセージの一覧を表示
     for msg in msg_list['messages']:
         topid = msg['id']
         msg = messages.get(userId='me', id=topid).execute()
         print("---")
         print(msg['snippet']) # 要約を表示

 # メッセージの取得を実行
 gmail_get_messages()

プログラムが正しく実行されると、メールを10件受信して、Jupyter Notebook上に表示する。

  • メールを10件だけ表示

    メールを10件だけ表示

(参考) Gmail APIの情報はどこにあるの? なお、本稿で紹介しているGoogleのAPIをはじめとして、APIというのは、サービスの提供者によって仕様が変更になることがある。もしも、将来的に、ここで紹介しているプログラムが動かなくなったり、もっと自分で調べてみたいときには、こちらのGoogleの開発社向けAPIの解説(https://developers.google.com/gmail/api/quickstart/python)を参考にすると良いだろう。

まとめ

以上、今回は、PythonからGmailで受信メールの要約を表示するプログラムを作ってみた。今回、プログラムを実行するまでの手順だけで、ずいぶん長くなってしまった。そこで、次回、プログラムの解説と、応用プログラムを紹介する。お楽しみに。