eyecatch thumbnail

Gmail API で取得したメール本文をデコード処理する方法 – Python 編

Profile picture
ルッチ / Lucci
2020.10.11

Contents


はじめに

Gmail API を叩いて取得したメール本文をデコードする方法を紹介します.

“Gmail API を叩いてメールを取得することはできたのだけどメール本文を取得できずに困っている” そんな人にぜひとも読んでもらいたい記事です.

メール本文を取得するには次の2ステップが必要です.

  1. メール本文を探す
    => message["payload"]["body"]["data"] の値がメール本文である
  2. メール本文をデコードする
    => gmail.decode(encoded) で base64 形式でデコードする

それぞれ説明しますが,すでに何かしらのメールメッセージを取得している状態を前提として説明します. まだメールメッセージを取得していない方は #gmail の関連記事をお読みください.

参考書籍:

メール本文を探す

取得したメールメッセージは次のような json 形式で定義されていると思います.(REST Resource: users.messages)

{
  "id": string,
  "threadId": string,
  "labelIds": [
    string
  ],
  "snippet": string,
  "historyId": string,
  "internalDate": string,
  "payload": {
    object (MessagePart)
  },
  "sizeEstimate": integer,
  "raw": string
}

この中の MessagePart は次のような json 形式になっています.(MessagePart)

{
  "partId": string,
  "mimeType": string,
  "filename": string,
  "headers": [
    {
      object (Header)
    }
  ],
  "body": {
    object (MessagePartBody)
  },
  "parts": [
    {
      object (MessagePart)
    }
  ]
}

そしてお目当てのメール本文は MessagePartBody に次のような json 形式で定義されています.(Resource: MessagePartBody)

{
  "attachmentId": string,
  "size": integer,
  "data": string
}

この json 形式の data キーに紐つく値が探していたメール本文です. この data の値を出力させてみればわかりますが base64 形式でエンコードされた文字列となっています.

メール本文を json から抽出する方法は message["payload"]["body"]["data"] にアクセスできれば何でも良いです. 筆者は自作関数 get_message_body(message) を使ってメール本文を一行で抽出しています.

See https://gitlab.com/typememo/typememo_/-/blob/master/tools/gmail.py

def get_message_body(message):
  """Get message body."""
  part = get_message_part(message)
  body = part["body"]["data"]
  return body

def get_message_part(message):
  """Get message part."""
  message_part = message["payload"]
  return message_part

メール本文をデコードする

ということでめでたくメール本文を見つけることができました. しかも base64 形式でエンコードされている文字列であるということもわかりました.

メール本文を base64 形式でデコードしてあげれば人が読める形式になります. base64 ライブラリを使えば簡単にデコードすることができます.

筆者は base64 ライブラリを使った decode(encoded) という関数をメール取得関数などと同じファイルに記述しています. gmail.decode(encoded) と書けば base64 形式でデコードされるようになっているので扱いやすいです.

See https://gitlab.com/typememo/typememo_/-/blob/master/tools/gmail.py

import base64

def decode(encoded):
  """Decode message body."""
  decoded = base64.urlsafe_b64decode(encoded).decode()
  return decoded

おわりに

Gmail API を叩いてメール本文を取得してデコードする方法についての解説記事でした.

参考になりましたでしょうか?

何か不明点などあれば Gitlab のイシューに書いていただけるとありがたいです.

この記事を気に入っていただけましたら,twitter などで #typememo とハッシュタグをつけて呟いていただけるととても嬉しいです.

最後までお読みいただきありがとうございました.

お手紙 お待ちしております!

愛用品

  • Xiser Pro Trainer
    1日中踏み続けられる強靭なステッパーでおすすめです.
  • HHKB Professional 墨 x HHKB キートップセット 白
    ボディは墨色キートップは白色なのでめちゃめちゃ目に優しいのでおすすめです.
  • Apple Magic Mouse 2
    トラックパッドは指が攣りそうになりますけどマウスはその心配が無いのでおすすめです.
  • Apple MacMini
    ミニマルでパワフルなデスクトップ PC なので個人的に大好きなのでおすすめです.
  • iiyama Display 27inch FullHD
    鮮明すぎない画面で目も疲れにくいですし何より高さ調節できるのが最高なのでおすすめです.
  • KINTO UNITEA 550ml
    500ml の大容量でこの綺麗なデザインは他にみたことがないのでおすすめです.

関連記事


Python 初学者へのお知らせ

約2時間で Python の基礎を学び、簡単なゲームを作ってみませんか?

そんな方に、Python の基本を実践的に学びたい人向けの講座、【無料】ゼロから始めるPythonプログラミング入門講座(週4開催)をお勧めします。

tech-ad-techgym-python

この講座で、無料でゲーム開発を通してプログラミングの基礎を身につけてみませんか?

少しでも気になった方は、上記のテキストリンクもしくは画像リンクから申し込みお願いします!

Python との楽しい日々をお過ごしください:)

大学生へのお知らせ

ここまで記事を読んでくれて本当に嬉しいです、ありがとうございます。

プログラミングを始めたばかりの頃って「やるぞ!」という気持ちは強めですが、 実際に取り組み始めると「何からどうやってどこまでやればいんだ?」 という感じで羅針盤を失うことが多いような気がします。(実体験)

そんな勉強熱心で向上心高めなんだけど目指す姿が曖昧な大学生の方に感謝の意も込めて、就職活動までサポートするプログラミングスクール「レバテックカレッジ」を紹介します。↓

Levtech-college

「自走力」のあるエンジニアを最短3ヶ月で目指せるカリキュラムが月額30,000円で用意されていて、 現段階の「目指す姿が曖昧で何から手をつければいいかわからない状態」から脱却できます。

自分は実際にIT企業で働いていますが、「自走力」のあるエンジニアの方にはいつも助けられています。

なので、目指す姿が曖昧な人はとりあえずレバテックカレッジが導いてくれる 「自走力のあるエンジニア」を目指してみるのはスタートダッシュとしてはアリです。

レベルアップしてからジョブチェンするのはRPGでも常套手段ですし、 レバテックカレッジで一通りのスキルを習得してから自分の目指す姿を再定義するといいかもです。

「自走力のあるエンジニア」って実際どんなエンジニアなの? 何から手をつければいいかわからないから教えて欲しい、 という人は上のテキストリンク/画像リンクから「無料相談会」への申し込みをお願いします。

よきエンジニアライフを!