[Python] Gmail APIで受診したメールを取得する方法
Gmail APIを使用して受信メールを取得するには、まずGoogle Cloud Consoleでプロジェクトを作成し、Gmail APIを有効化します。
その後、OAuth 2.0認証を設定し、クライアントIDとクライアントシークレットを取得します。
Pythonでは、google-auth
やgoogle-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でプロジェクトを作成する
- Google Cloud Consoleにアクセスします。
- 「プロジェクトを選択」ボタンをクリックし、「新しいプロジェクト」を選択します。
- プロジェクト名を入力し、必要に応じて組織を選択します。
- 「作成」ボタンをクリックしてプロジェクトを作成します。
Gmail APIを有効化する
OAuth 2.0認証情報を作成する
- 「APIとサービス」→「認証情報」を選択します。
- 「認証情報を作成」ボタンをクリックし、「OAuth クライアント ID」を選択します。
- 「同意画面の設定」を求められた場合は、必要な情報を入力し、保存します。
- アプリケーションの種類を「デスクトップアプリ」に設定し、名前を入力します。
- 「作成」ボタンをクリックします。
クライアントIDとクライアントシークレットの取得
- OAuth 2.0クライアントIDが作成されると、クライアントIDとクライアントシークレットが表示されます。
- これらの情報は、後でPythonプログラムで使用するためにメモしておきます。
OK
ボタンをクリックして、認証情報の画面に戻ります。- 必要に応じて、クライアント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の準備から、メールリストの取得、メールの詳細情報の取得、メールデータの解析、さらには応用例として特定の送信者からのメールを取得する方法や未読メールの取得、メールの内容や添付ファイルの自動保存についても触れました。
これらの知識を活用することで、Pythonを用いたメール管理の自動化が可能になりますので、ぜひ実際に手を動かして試してみてください。