【GCP】 Python + Gmail API + Sheets API で 「Gmail 送信」を試してみた
はじめに
今回は、Google Cloud を使って、Gmail 送信を試してみました。
選定理由は、Webサービスにするほど規模もでかくないからです。また、スクリプトを exe化して Windows 環境で実行する背景があります。
メンテナンスするにも、お客様はプログラムの手直しができないので、アカウント管理など、スプレッドシートに持たせることで、ある程度自由に変更することも可能になることを想定してます。運用コストもDB・サーバを持たないので、APIリクエスト数を気にしておけばそれほどかからないかと。
前提条件
以下の設定はできてる状態から書いていこうかと、結構最初は分けわからず調べなからすすめました。
- Google Cloud で プロジェクト作成し、OAuth 2.0 クライアントの JSONファイルを用意
- Google Sheet 操作するために、サービス アカウント キー を作成
- Gmail API の有効化
- Google Sheets API の有効化
</>リポジトリ
イメージ
ザックリ!! ... 実装したイメージになります. こういうのサクッと作れるようにお試し中です!!
最近、実務でも求められて作成するんですが、4,5 時間かかってるイメージ 。。
慣れれば、使い回しとかできて工数も削減かと。drawio で書いてみてます。
っと、実際の流れは、以下のように、
1. スクリプト実行
2. スプレッドシート読み込む(アカウント一覧)
3. 指定アカウント選択
4. 指定アカウント・メールテンプレの情報を取得
5. Gmail API で送信
6. 結果確認
のような感じです!
手順
ここからは、実装したときの手順を書いていきたいと思います。前提条件で、必要な登録は済ませていることとしておきます。他の記事を参考にしたらたくさん情報あるかとです!
では、以下の流れから書いていきます.
1. サービスアカウントのメールで、使いたいスプレッドシートを共有する
まず、GCP で作成したプロジェクトから入って、作成したサービスアカウントページの詳細から、メールを確認して、紐付けしたいスプレッドシートに共有で追加しておきます.
サービスアカウント詳細ページ
使いたいスプレッドシート
2. スプレッドシートの中身を入力
アカウント一覧シートには、以下の情報を入れました。用途に合わせて、メール CC・BCC の項目などあった方が良さそうですね.
zip パスワードは、添付ファイルにつけるパスワードを想定しています。
# セル: 項目
A: ID
B: アカウント名
C: メールアドレス(TO)
D: zipパスワード
アカウント一覧
メール_テンプレのシートには以下を持たせました。
# セル: 項目
A: ID
B: 件名
C: 本文
メールテンプレート
今回は、アカウント情報と、メールテンプレートにシート分けましたが ... 。1シートに全ての情報を持たせたほうが、API リクエスト数を減らすことも可能かと。
意図としては、アカウントにより参照するメールテンプレートを選択できる仕様にもカスタマイズしやすいかなっと思った次第です。後、メールテンプレート全共通なら、スクリプト側に持たせる方が単純に書けて良さそうでもあります。件名・お客様名を変数に持たせるなどすれば。
3. Python スクリプト作成
ここは、実際書いたスクリプトをリポジトリとして共有したので、気になる方はロジックみていただけると幸いです🙏
ポイントとしては、
ですかね。
あとは、やりたいことに合わせて、実装していけば良いかと✋
-
json ファイルの配置
こんな感じで、参照できるように配置しておくとOKです❗️格納パス 詳細 ./token/credentials.json
OAuth 2.0 クライアントの JSONファイル: サンプルコードに合わせた名称 ./token/service-account-key.json
サービスアカウントキー: 自分で管理しやすい名称でOKです -
Gmail API リクエスト部分
- Sheets API リクエスト部分
4. スクリプト実行してみる
1. main.py を実行
2. アカウント一覧から、No.1 のアカウント名を選択
3. 指定アドレスに mail 送信されていることが確認できた
ちょっと、アドレス隠したかったので、無理やり隠してますが、、まッ! 実装できていることが伝われば幸いです 🍊
今後の展開として
-
セキュア面を考えて、サービスアカウントキーは json ファイルより Workload Identityを試してみたいかなっと
-
ハードコートな箇所のリファクタリング
-
GUI ライブラリをつかってデスクトップアプリにする。今はコンソール上でアカウント選択してるので
-
Slack アラート通知も入れると Error 吐いたとき監視できたり
とかですかね。
以上です。ありがとうございました 🙏
参考
Discussion