Python日記

【GAS】PythonでGmail APIを使って、メール内容を取得する流れ【スクリプト作成編】

2021年4月1日

GAS GmailAPIを使ってメール情報取得の巻
お悩みさん

PythonでGmailの情報を取得する方法ってないの〜?!

PythonでGAS(Google App Script)を使いたい、そんな方に向けた記事です。

PythonでGmailの情報を取得するには、Gmail APIを使う必要があります。

前回(以下)の記事では、認証情報を取得する方法を解説しました。

今回は、PythonとGmailの連携方法(後編)として、

実際にスクリプトを書いて、PythonでGmailの情報を取得していきます。

クリワン

この記事はこんな方におすすめです!

  • ノンプログラマーだけど、GASを使えるようになりたい
  • マーケティング業務でデータ解析をしていきたい
  • ITスキルを身につけて、年収をアップさせたい

この記事で学べること

  1. PythonでGmail APIを使う、スクリプトの作成
  2. セキュリティ認証の方法
  3. Gmail API の設定の流れ

環境

OSMac 10.15.4
Pythonpython 3.9
仮想環境Poetry
Homebrew8.0.19 Homebrew

jsonスクリプトと、メソッドの作成

前回の記事で、Google API Platformからjsonファイルをダウンロードしました。

ここでは、jsonファイルのファイル名をcredentials.json に変更します。

credentials.json gmail_api.py ファイル名 フォルダ

続いて、gmailメソッドを作成します。ファイル名は gmail_api.py にしています。

【追記】この記事を作成したときは必要だと思ったのですが、このスクリプト(gmail_api.py)は不要の可能性があります。
当時なぜこのメソッドが必要だと考えたのか失念してしまい、テストができていないため、念のため残しています。

class GmailAPI:
    def __init__(self):
        # If modifying these scopes, delete the file token.json.
        self._SCOPES = "https://www.googleapis.com/auth/gmail.readonly"

    def connect_gmail(self):
        store = file.Storage("token.json")
        creds = store.get()
        if not creds or creds.invalid:
            flow = client.flow_from_clientsecrets("credentials.json", self._SCOPES)
            creds = tools.run_flow(flow, store)
        service = build("gmail", "v1", http=creds.authorize(Http()))

        return service

flowの部分には、先のファイル名'credentials.json' を引数に入れています。

パッケージのインストール

PythonでGmail APIを使うためのライブラリをインストールします。

Poetryを使っている場合は、以下は飛ばして、「Poetry環境でのモジュールを追加」を確認してください。

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

Poetry環境でのモジュールを追加

Poetryを使っていない場合は、飛ばしてください。

Poetryを使っている場合は、以下でGmailのモジュールを追加します。

poetry add gmail
Using version ^0.6.3 for gmail

Updating dependencies
Resolving dependencies... (0.6s)

Writing lock file


Package operations: 1 install, 0 updates, 0 removals

  - Installing gmail (0.6.3)

続いて、oauth2clientを追加します。

poetry add oauth2client
Using version ^4.1.3 for oauth2client

Updating dependencies
Resolving dependencies... (0.4s)

Writing lock file


Package operations: 7 installs, 0 updates, 0 removals

  - Installing pyasn1 (0.4.8)
  - Installing pyparsing (2.4.7)
  - Installing httplib2 (0.19.1)
  - Installing pyasn1-modules (0.2.8)
  - Installing rsa (4.7.2)
  - Installing six (1.15.0)
  - Installing oauth2client (4.1.3)

これでPoetryの環境が構築できました

Gmailのセキュリティ環境

初めてGmail APIの処理をする際は、

Googleのアカウントのセキュリティエラーが発生するため、以下の処理が必要になります。

まず、Googleのアカウントのセキュリティを選択し、

「安全性の低いアプリ」のアクセスを有効にします。

Googleのアカウント セキュリティ アクセスを有効にする
Googleアカウント 安全性の低いアプリの許可:有効

Gmailの二段階認証の設定方法

もしもGmailの二段階認証を設定している方は、以下の記事を参照してください。

Pythonのスクリプトを作成

これからは、実際のPythonのスクリプトを作成していきます。

ファイル名は、inbox.py にしています。

inbox.py ファイル名 フォルダ

Pythonスクリプトの内容

スクリプトの中身は以下です。

import imaplib
import email
from oauth2client.service_account import ServiceAccountCredentials
from email.message import EmailMessage

host = 'imap.gmail.com'
username = 'xxxxxxxxx@gmail.com'
password = 'xxxxxxxxxxxxx'


def get_inbox():
    mail = imaplib.IMAP4_SSL(host)
    mail.login(username, password)
    mail.select('inbox')
    _, search_data = mail.search(None, 'UNSEEN')
    my_message = []

    for num in search_data[0].split():
        email_data = {}
        _, data = mail.fetch(num, '(RFC822)')
        # print(data[0])
        _, b = data[0]
        email_message = email.message_from_bytes(b)
        #email_message = email.message_from_string(b)
        for header in ['subject', 'to', 'from','date']:
            print("{}:{}".format(header, email_message[header]))
            email_data[header] = email_message[header]
        # print(email_message)
        for part in email_message.walk():
            if part.get_content_type() == 'text/plain':
                body = part.get_payload(decode=True)
                email_data['body'] = body.decode()
            elif part.get_content_type() == 'text/html':
                html_body = part.get_payload(decode=True)
                email_data['html_body'] = html_body.decode() 
        my_message.append(email_data) 
    return my_message 

if __name__ == '__main__':
    my_inbox = get_inbox()
    print(my_inbox)

上記スクリプトについての補足

Gmailのログイン

host = 'imap.gmail.com'
username = 'xxxxxxxxx@gmail.com'
password = 'xxxxxxxxxxxxx'

password の変数には、ご自身のパスワード(Gmail)が入ります。

username の変数には、ご自身のメールアドレス(Gmai)を記入。

Gmail情報の選択

今回は、inboxの中から、未読のメールを取得できるよう

'UNSEEN'を選択しました。

def get_inbox():
    mail = imaplib.IMAP4_SSL(host)
    mail.login(username, password)
    mail.select('inbox')
    _, search_data = mail.search(None, 'UNSEEN')
    my_message = []

もしもPythonを実行時に未読メールがない場合、情報が取得できないので、注意してください!

【Pythonの実行】メール情報の取得

今回は、こちらの未読メールを取得します。

ここではメールを開いていますが、未読メールに変更しています。
またこのメール以外のメールは既読にしています。

Gmail Hello world 受信結果

さきほど作成したPythonの実行をしたところ、以下が返ってきました。

subject:Hello world
to:xxxxxxxx@gmail.com
from:=xxxxxxxxxxxxxxxx= <xxxxxxxx@gmail.com>
date:Thu, 1 Apr 2021 11:30:59 +0900
[{'subject': 'Hello world', 'to': 'xxxxxxxx@gmail.com', 'from': '=xxxxxxxxxxxxxxxx= <xxxxxxxx@gmail.com>', 'date': 'Thu, 1 Apr 2021 11:30:59 +0900', 'body': 'Hello xxxxxxxx,\r\nThank you for joining cfe.sh. We are very happy to have you with us.\r\n', 'html_body': '<div dir="ltr">Hello xxxxxxxx,<br>Thank you for joining cfe.sh. We are very happy to have you with us.<br></div>\r\n'}]
解決さん

やった!Gmailの未読メールが、Pythonから取得できた!

問題なく、メールの内容を取得することができました。

まとめ

この記事で学んだこと

  1. PythonでGmail APIを使う、スクリプトの作成
  2. セキュリティ認証の方法
  3. Gmail API の設定の流れ

前編・後編、2つの記事で、PythonとGmailを連携するフローを解説しました。

僕自身、Gmailは業務になくてはもはやならないものなので、

Pythonを使うことで、さまざまな業務効率化が考えれます。

設定自体は、多少手間はかかりますが、非常に便利な機能がつくれるはずなので、

ぜひいろいろと試してみてください。

参考動画

今回、ご紹介したPythonスクリプトの内容は、以下の動画を参考にしています。

残念ながら英語しかないのですが、とても勉強になるので、

英語に抵抗がない方は、ぜひこちらもチェックしてみてください。

-Python日記
-,