eyecatch thumbnail

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

Profile picture
Takeru Yamada
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 の大容量でこの綺麗なデザインは他にみたことがないのでおすすめです.

関連記事