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

GAS GmailAPIを使ってメール情報取得の巻

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

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

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

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

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

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

この記事で学べること
  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
pip install --upgrade oauth2client --ignore-installed six

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のアカウント セキュリティ アクセスを有効にする
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から取得できた!

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

まとめ

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

僕自身、Gmailは業務になくてはもはやならないものなので、Pythonを使うことで、さまざまな業務効率化が考えれます。

設定自体は、多少手間はかかりますが、非常に便利な機能がつくれるはずなので、ぜひいろいろと試してみてください。

参考動画

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

残念ながら英語しかないのですが、とても勉強になるので、英語に抵抗がない方は、ぜひこちらもチェックしてみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

節約に励むマーケターです!30歳を機に別職種から、マーケターにキャリアチェンジ。IT企業で専任のマーケターをしています。0からプログラミングを学びはじめました! ★データサイエンティストの勉強中です!お問合せはこちら!

コメント

コメントする

CAPTCHA


目次