[Python] Gmail APIで受診したメールを取得する方法

Gmail APIを使用して受信メールを取得するには、まずGoogle Cloud Consoleでプロジェクトを作成し、Gmail APIを有効化します。

その後、OAuth 2.0認証を設定し、クライアントIDとクライアントシークレットを取得します。

Pythonでは、google-authgoogle-api-python-clientライブラリを使用して認証を行い、service.users().messages().list(userId='me')メソッドでメールのリストを取得します。

メールの詳細はmessages().get()で取得可能です。

この記事でわかること
  • Gmail APIの基本的な使い方
  • メールの取得方法と解析手法
  • 特定の条件でのメール取得方法
  • メールデータの保存とダウンロード方法
  • API利用時の注意点と対処法

目次から探す

Gmail APIとは

Gmail APIは、Googleが提供するRESTfulなインターフェースで、開発者がGmailの機能にアクセスし、操作することを可能にします。

このAPIを使用することで、メールの送受信、ラベルの管理、スレッドの取得など、さまざまな操作をプログラムから自動化できます。

特に、Pythonなどのプログラミング言語を用いることで、効率的にメールの管理や分析を行うことができ、ビジネスや個人のニーズに応じたカスタマイズが可能です。

Gmail APIは、OAuth 2.0を用いた認証を必要とし、セキュリティを確保しながら、ユーザーのメールデータにアクセスすることができます。

Gmail APIの準備

Google Cloud Consoleでプロジェクトを作成する

作成済みのプロジェクトを使う場合は不要です。

  1. Google Cloud Consoleにアクセスします。
  2. 「プロジェクトを選択」ボタンをクリックし、「新しいプロジェクト」を選択します。
  3. プロジェクト名を入力し、必要に応じて組織を選択します。
  4. 「作成」ボタンをクリックしてプロジェクトを作成します。

Gmail APIを有効化する

STEP
作成したプロジェクトを選択した状態で、左側のメニューから「APIとサービス」→「ライブラリ」を選択します。
STEP
検索バーに Gmail API と入力し、表示された結果から Gmail API を選択します。
STEP
「有効にする」ボタンをクリックして、APIを有効化します。

OAuth 2.0認証情報を作成する

  1. 「APIとサービス」→「認証情報」を選択します。
  2. 「認証情報を作成」ボタンをクリックし、「OAuth クライアント ID」を選択します。
  3. 「同意画面の設定」を求められた場合は、必要な情報を入力し、保存します。
  4. アプリケーションの種類を「デスクトップアプリ」に設定し、名前を入力します。
  5. 「作成」ボタンをクリックします。

クライアントIDとクライアントシークレットの取得

  1. OAuth 2.0クライアントIDが作成されると、クライアントIDとクライアントシークレットが表示されます。
  2. これらの情報は、後でPythonプログラムで使用するためにメモしておきます。
  3. OK ボタンをクリックして、認証情報の画面に戻ります。
  4. 必要に応じて、クライアントIDの詳細をダウンロードしてJSONファイルとして保存します。

Python環境の準備

必要なライブラリのインストール

Gmail APIを使用するためには、いくつかのPythonライブラリをインストールする必要があります。

以下のライブラリをインストールします。

google-authライブラリのインストール

google-authライブラリは、GoogleのAPIにアクセスするための認証を行うために必要です。

以下のコマンドを実行してインストールします。

pip install google-auth

google-api-python-clientライブラリのインストール

google-api-python-clientライブラリは、GoogleのAPIを操作するためのクライアントライブラリです。

以下のコマンドを実行してインストールします。

pip install google-api-python-client

認証用のスクリプトを作成する

次に、Gmail APIにアクセスするための認証用スクリプトを作成します。

以下のコードをgmail_auth.pyというファイル名で保存します。

import os
import pickle
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
# スコープの設定
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
def authenticate_gmail_api():
    creds = None
    # トークンが保存されている場合は、読み込む(ファイルパスは環境に合わせて変更する)
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # 認証情報が無効な場合は再認証
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # 認証情報を保存
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)
    return creds
if __name__ == '__main__':
    authenticate_gmail_api()

認証トークンの取得

上記のスクリプトを実行すると、ブラウザが開き、Googleアカウントへのアクセスを許可するよう求められます。

許可を行うと、認証トークンがtoken.pickleというファイルに保存されます。

このトークンを使用して、Gmail APIにアクセスすることができます。

python gmail_auth.py

このスクリプトを実行後、認証が成功すると、token.pickleファイルが生成され、以降のAPI呼び出しでこのトークンを使用して認証が行われます。

Gmail APIでメールを取得する方法

Gmail APIを使用して、受信したメールを取得する方法について説明します。

まず、メールリストを取得し、その後、特定のメールの詳細を取得する手順を見ていきます。

メールリストを取得する

Gmail APIを使用して、受信トレイにあるメールのリストを取得するには、messages().list()メソッドを使用します。

messages().list()メソッドの使い方

以下のサンプルコードでは、Gmail APIを使用してメールのリストを取得する方法を示します。

from googleapiclient.discovery import build
def get_email_list(creds):
    service = build('gmail', 'v1', credentials=creds)
    results = service.users().messages().list(userId='me', maxResults=10).execute()
    messages = results.get('messages', [])
    
    if not messages:
        print("メールは見つかりませんでした。")
    else:
        print("取得したメールのID:")
        for message in messages:
            print(message['id'])
if __name__ == '__main__':
    creds = authenticate_gmail_api()  # 先ほど作成した認証関数を呼び出す
    get_email_list(creds)

このコードを実行すると、受信トレイにある最新の10件のメールのIDが表示されます。

メールのフィルタリング方法

messages().list()メソッドには、さまざまなフィルタリングオプションがあります。

例えば、特定のラベルを持つメールを取得するには、labelIdsパラメータを使用します。

以下のように指定できます。

results = service.users().messages().list(userId='me', labelIds=['INBOX'], maxResults=10).execute()

この例では、受信トレイ(INBOX)にあるメールのみを取得します。

メールの詳細を取得する

メールのリストから特定のメールの詳細を取得するには、messages().get()メソッドを使用します。

messages().get()メソッドの使い方

以下のサンプルコードでは、特定のメールの詳細を取得する方法を示します。

def get_email_details(creds, message_id):
    service = build('gmail', 'v1', credentials=creds)
    message = service.users().messages().get(userId='me', id=message_id).execute()
    
    print("メールの件名:", message['payload']['headers'][0]['value'])  # 件名を表示
    print("メールのID:", message['id'])
if __name__ == '__main__':
    creds = authenticate_gmail_api()
    message_id = '取得したいメールのIDをここに入力'  # 取得したメールのIDを指定
    get_email_details(creds, message_id)

このコードを実行すると、指定したメールの件名とIDが表示されます。

メール本文の取得方法

メールの本文を取得するには、payloadフィールドを解析する必要があります。

以下のコードは、メールの本文を取得する方法を示しています。

def get_email_body(message):
    if 'parts' in message['payload']:
        for part in message['payload']['parts']:
            if part['mimeType'] == 'text/plain':
                return part['body']['data']
    return message['payload']['body']['data']
# 使用例
body_data = get_email_body(message)
print("メールの本文:", body_data)  # Base64エンコードされた本文を表示

このコードでは、メールの本文を取得し、Base64エンコードされたデータを表示します。

デコードすることで、実際の本文を表示できます。

添付ファイルの取得方法

メールに添付ファイルがある場合、partsフィールドを確認し、添付ファイルの情報を取得します。

以下のコードは、添付ファイルを取得する方法を示しています。

def get_attachments(message):
    attachments = []
    if 'parts' in message['payload']:
        for part in message['payload']['parts']:
            if part['filename']:
                attachments.append(part['filename'])
    return attachments
# 使用例
attachments = get_attachments(message)
print("添付ファイル:", attachments)  # 添付ファイルの名前を表示

このコードを実行すると、メールに含まれる添付ファイルの名前が表示されます。

必要に応じて、添付ファイルをダウンロードする処理を追加することもできます。

メールデータの解析

Gmail APIを使用して取得したメールデータは、さまざまな形式で構成されています。

ここでは、メールのヘッダー情報、本文、MIME形式のメールを解析する方法について説明します。

メールのヘッダー情報を解析する

メールのヘッダー情報には、送信者、受信者、件名、日付などの重要な情報が含まれています。

以下のサンプルコードでは、メールのヘッダー情報を解析する方法を示します。

def parse_email_headers(message):
    headers = message['payload']['headers']
    header_info = {}
    for header in headers:
        name = header['name']
        value = header['value']
        header_info[name] = value
    return header_info
# 使用例
header_info = parse_email_headers(message)
print("メールのヘッダー情報:", header_info)  # ヘッダー情報を表示

このコードを実行すると、メールのヘッダー情報が辞書形式で表示されます。

これにより、送信者や件名などの情報を簡単に取得できます。

メール本文の解析方法

メールの本文は、通常、テキスト形式またはHTML形式で提供されます。

以下のサンプルコードでは、メールの本文を解析し、テキスト形式で表示する方法を示します。

import base64
def decode_email_body(body_data):
    # Base64でエンコードされた本文をデコード
    decoded_bytes = base64.urlsafe_b64decode(body_data.encode('UTF-8'))
    return decoded_bytes.decode('UTF-8')
# 使用例
body_data = get_email_body(message)  # 先ほどの関数を使用
decoded_body = decode_email_body(body_data)
print("デコードされたメールの本文:", decoded_body)  # デコードされた本文を表示

このコードでは、Base64エンコードされたメールの本文をデコードし、実際のテキストを表示します。

MIME形式のメールを扱う方法

MIME(Multipurpose Internet Mail Extensions)形式は、メールの内容を構造化するための標準です。

MIME形式のメールは、テキスト、画像、音声、動画など、さまざまなメディアタイプを含むことができます。

以下のサンプルコードでは、MIME形式のメールを扱う方法を示します。

from email import message_from_bytes
def parse_mime_email(raw_email):
    # 生のメールデータをMIME形式のメッセージに変換
    mime_message = message_from_bytes(raw_email)
    return mime_message
# 使用例
raw_email = b'生のメールデータをここに入力'  # 生のメールデータを指定
mime_message = parse_mime_email(raw_email)
print("MIME形式のメール:", mime_message)  # MIME形式のメールを表示

このコードでは、生のメールデータをMIME形式のメッセージに変換し、解析することができます。

MIME形式のメールを扱うことで、複雑なメール構造を簡単に操作できるようになります。

以上の方法を使用することで、Gmail APIを通じて取得したメールデータを効果的に解析し、必要な情報を抽出することができます。

応用例

Gmail APIを使用することで、さまざまな応用が可能です。

ここでは、特定の送信者からのメールを取得する方法、未読メールのみを取得する方法、メールの内容を自動で保存する方法、添付ファイルを自動でダウンロードする方法について説明します。

特定の送信者からのメールを取得する

特定の送信者からのメールを取得するには、messages().list()メソッドqパラメータを使用して検索クエリを指定します。

以下のサンプルコードでは、特定のメールアドレスからのメールを取得する方法を示します。

def get_emails_from_sender(creds, sender_email):
    service = build('gmail', 'v1', credentials=creds)
    query = f'from:{sender_email}'
    results = service.users().messages().list(userId='me', q=query).execute()
    messages = results.get('messages', [])
    
    if not messages:
        print("指定された送信者からのメールは見つかりませんでした。")
    else:
        print("取得したメールのID:")
        for message in messages:
            print(message['id'])
# 使用例
if __name__ == '__main__':
    creds = authenticate_gmail_api()
    get_emails_from_sender(creds, 'example@example.com')  # 取得したい送信者のメールアドレスを指定

未読メールのみを取得する

未読メールを取得するには、qパラメータにis:unreadを指定します。

以下のサンプルコードでは、未読メールを取得する方法を示します。

def get_unread_emails(creds):
    service = build('gmail', 'v1', credentials=creds)
    query = 'is:unread'
    results = service.users().messages().list(userId='me', q=query).execute()
    messages = results.get('messages', [])
    
    if not messages:
        print("未読メールは見つかりませんでした。")
    else:
        print("取得した未読メールのID:")
        for message in messages:
            print(message['id'])
# 使用例
if __name__ == '__main__':
    creds = authenticate_gmail_api()
    get_unread_emails(creds)

メールの内容を自動で保存する

メールの内容を自動で保存するには、取得したメールの本文をファイルに書き込む処理を追加します。

以下のサンプルコードでは、メールの内容をテキストファイルに保存する方法を示します。

def save_email_content(creds, message_id):
    service = build('gmail', 'v1', credentials=creds)
    message = service.users().messages().get(userId='me', id=message_id).execute()
    body_data = get_email_body(message)  # 本文を取得
    decoded_body = decode_email_body(body_data)  # デコード
    
    # メールの内容をファイルに保存
    with open(f'email_{message_id}.txt', 'w', encoding='utf-8') as f:
        f.write(decoded_body)
    print(f"メールの内容を'email_{message_id}.txt'に保存しました。")
# 使用例
if __name__ == '__main__':
    creds = authenticate_gmail_api()
    message_id = '取得したいメールのIDをここに入力'  # 取得したメールのIDを指定
    save_email_content(creds, message_id)

添付ファイルを自動でダウンロードする

メールに添付されたファイルを自動でダウンロードするには、添付ファイルの情報を取得し、ファイルを保存する処理を追加します。

以下のサンプルコードでは、添付ファイルをダウンロードする方法を示します。

import base64
def download_attachments(creds, message_id):
    service = build('gmail', 'v1', credentials=creds)
    message = service.users().messages().get(userId='me', id=message_id).execute()
    
    for part in message['payload']['parts']:
        if part['filename']:
            attachment_id = part['body']['attachmentId']
            attachment = service.users().messages().attachments().get(userId='me', messageId=message_id, id=attachment_id).execute()
            data = attachment['data']
            file_data = base64.urlsafe_b64decode(data.encode('UTF-8'))
            
            # 添付ファイルを保存
            with open(part['filename'], 'wb') as f:
                f.write(file_data)
            print(f"添付ファイル'{part['filename']}'をダウンロードしました。")
# 使用例
if __name__ == '__main__':
    creds = authenticate_gmail_api()
    message_id = '取得したいメールのIDをここに入力'  # 取得したメールのIDを指定
    download_attachments(creds, message_id)

これらの応用例を通じて、Gmail APIを活用したさまざまな自動化処理を実現することができます。

よくある質問

Gmail APIの利用制限はありますか?

はい、Gmail APIには利用制限があります。

具体的には、APIの呼び出し回数に制限があり、1日あたりのリクエスト数や、1秒あたりのリクエスト数が設定されています。

これらの制限は、Google Cloud Consoleの「APIとサービス」セクションで確認できます。

また、特定のユーザーに対しても制限がかかる場合がありますので、注意が必要です。

利用制限を超えた場合、APIからエラーメッセージが返され、リクエストが拒否されることがあります。

OAuth 2.0認証の有効期限はどのくらいですか?

OAuth 2.0認証の有効期限は、取得したアクセストークンによって異なります。

通常、アクセストークンは1時間(3600秒)有効です。

トークンが期限切れになると、再度認証を行う必要があります。

ただし、リフレッシュトークンを使用することで、アクセストークンを自動的に更新することが可能です。

リフレッシュトークンは、ユーザーが再認証を行わなくても、アクセストークンを取得するために使用されます。

リフレッシュトークンの有効期限は、アプリケーションの設定によって異なる場合があります。

メールの取得に失敗する場合の対処法は?

メールの取得に失敗する場合、以下の対処法を試してみてください。

  • 認証情報の確認: OAuth 2.0の認証情報が正しいか、トークンが有効か確認します。
  • APIの利用制限の確認: APIの呼び出し回数が制限を超えていないか確認します。
  • クエリの確認: messages().list()メソッドのクエリが正しいか、フィルタリング条件が適切か確認します。
  • エラーメッセージの確認: APIから返されるエラーメッセージを確認し、具体的な問題を特定します。
  • インターネット接続の確認: ネットワーク接続が正常であるか確認します。

これらの対処法を試しても問題が解決しない場合は、Googleの公式ドキュメントやサポートフォーラムを参照することをお勧めします。

まとめ

この記事では、Gmail APIを使用して受信したメールを取得する方法について詳しく解説しました。

具体的には、Gmail APIの準備から、メールリストの取得、メールの詳細情報の取得、メールデータの解析、さらには応用例として特定の送信者からのメールを取得する方法や未読メールの取得、メールの内容や添付ファイルの自動保存についても触れました。

これらの知識を活用することで、Pythonを用いたメール管理の自動化が可能になりますので、ぜひ実際に手を動かして試してみてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • Microsoft Office (27)
  • Google (21)
  • URLをコピーしました!
目次から探す