Emailのテスト

Magic Podの使い方 > Emailのテスト

テストによっては、送信されたメールアドレスの内容をチェックしたり、メール内のリンクをクリックしたりする必要があります。

この流れを自動化する方法の1つは、G Suiteの組織に属するGmailのWeb APIを利用することです。テストにGmailのアドレスを利用すれば、送信されたメールの内容をGmail のWeb APIを使って取得することが可能です。ここではその方法を説明します。

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

まず最初に、Web APIの認証に必要な「クライアントID」「クライアント シークレット」を取得します。

まず、G Suiteに属するテスト用のGoogleアカウント(= Gmailアカウント)を1つ用意します(Web APIでメール内容を取得可能になってしまうため、普段使っているアカウントとは別のものを用意してください)。1

続いて、作成したGoogleアカウントでGoogleのDeveloper Consoleにサインインし、画面左上「プロジェクトの選択」から、好きなプロジェクト名で「プロジェクト」を作成します。

続いて、画面左上メニューの「APIとサービス」>「ダッシュボード」から、「ENABLE APIS AND SERVICES」を選択し、GmailのAPIを選んで有効化します。

APIの認証を行うには、先にOAuthを有効にする必要があります。まず、画面左上メニューの「APIとサービス」>「OAuth同意画面」を選択します。G Suiteのメールアドレスであれば、「User Type」に「内部」を選択できるので、これを選択します2

次の画面では、適当な「アプリケーション名」を指定し、さらに「スコープ」に「メール メッセージと設定の表示」を選択して「保存」を押しましょう。これでOAuthが有効になりました。

続いて「認証情報」を作成します。画面左上メニューの「APIとサービス」>「認証情報」から、「認証情報を作成」>「OAuth クライアントID」を選び、「アプリケーションの種類」を「デスクトップアプリ」にして「作成」を押します。

すると、「クライアントID」と「クライアント シークレット」が画面に表示されるので、どこかに保存しておきましょう。

「リフレッシュトークン」の取得

続いて、こちらもWeb APIの認証に必要な「リフレッシュトークン」を取得します。

まずは、下記URLのクライアントIDの部分を先ほど取得したクライアントIDの値に置き換え、そのURLをブラウザで開きます。3

https://accounts.google.com/o/oauth2/auth?client_id=<クライアントID>&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https://www.googleapis.com/auth/gmail.readonly&response_type=code&approval_prompt=force&access_type=offline

すると下図のようなページが表示されるので「許可」を押し、表示された「コード」をコピーしてどこかに保存しておきます。

続いて、MacのターミナルやLinuxのコンソールを開き、curlで以下のコマンドを実行します。

すると、以下のような値が返ってくるので、この中の「refresh_token」を保存しておきます。これが「リフレッシュトークン」になります。

メール本文を取得するテストスクリプト

「クライアントID」「クライアントシークレット」「リフレッシュトークン」の3つが揃ったので、これでMagic PodのテストスクリプトからGmailのAPIを呼び出すことができます。

まず、シークレット共有変数にCLIENT_ID、CLIENT_SECRET、REFRESH_TOKENの3つを定義し、それぞれに先ほど取得した値をセットします。

次に、下図のようにWeb APIコールのコマンドを呼び出し、リフレッシュトークンを元に最新の「アクセストークン」を取得します。

指定する値は以下の通りです。

  • メソッドに「POST」
  • URLに「https://accounts.google.com/o/oauth2/token」
  • ヘッダーに「Content-Type」「application/x-www-form-urlencoded」
  • ボディの「rawデータ」に「client_id=${CLIENT_ID}&client_secret=${CLIENT_SECRET}&refresh_token=${REFRESH_TOKEN}&grant_type=refresh_token」
  • 結果に「ACCESS_TOKEN」「jsonResponse["access_token"]」

これを実行すると、変数ACCESS_TOKENにアクセストークンの値がセットされます4

続いて、このアクセストークンを使い、指定した条件に一致するメールのリストを取得します。今度は、次のようにWeb APIコールを呼び出します。

指定する値は以下の通りです。

  • メソッドに「GET」
  • URLに「https://www.googleapis.com/gmail/v1/users/me/messages/?q=<検索条件>」。<検索条件>の部分は、Gmailの検索条件の記法がそのまま使えます。例えば、以下のような書き方が可能です。5
    • q=new_user12345678 (本文などに「new_user12345678」を含むメールを取得)
    • q="from:no-reply@magic-pod.com" (「no-reply@magic-pod.com」から送信されたメールを取得)
    • q="subject:ユーザー認証" (タイトルに「ユーザー認証」を含むメールを取得)
  • ヘッダーに「Authorization」「Bearer ${ACCESS_TOKEN}」
  • 結果に「MAIL_ID」「jsonResponse["messages"][0]["id"]」

これを実行すると、変数「MAIL_ID」に、<検索条件>にマッチする最新のメールのIDが格納されます。

続いて、このMAIL_IDにマッチするメールの本文を取得します。次のようにWeb APIコールを呼び出します。

指定する値は以下の通りです。

  • メソッドに「GET」
  • URLに「https://www.googleapis.com/gmail/v1/users/me/messages/${MAIL_ID}」
  • ヘッダーに「Authorization」「Bearer ${ACCESS_TOKEN}」
  • 結果に「MAIL_CONTENTS」「Buffer.from(jsonResponse["payload"]["body"]["data"], "base64").toString("utf8")」。6

これで、変数MAIL_CONTENTSにメール本文の内容が保存されます。

あとは、「確認」コマンドでメール本文の内容が期待値通りかチェックしたり、「正規表現に一致した部分を保存」コマンドでメール本文の特定の箇所を取り出したりすることが可能です。

メール本文のURLをクリックしてユーザー認証を完了する、などの処理を行いたい場合は、「正規表現に一致した部分を保存」コマンドでURL部分を取り出した後、「URL指定で遷移」コマンドでそのURLに遷移するとよいでしょう。

  1. G Suiteに属していないメールアドレスでもWeb APIは利用できますが、設定がかなり煩雑になります。 []
  2. G Suiteのメールアドレスでない場合、「外部」を選択してGoogleによる確認を受ける必要があります。この確認が完了すれば、G Suite以外のメールアドレスでもおそらくWeb APIを利用可能です。 []
  3. ブラウザはテスト用のGoogleアカウントでログインしている必要があります。 []
  4. 取得したアクセストークンは、30分以内なら何度も使い回すことができます。 []
  5. 詳しい記法はこちらを参考にしてください。 []
  6. Web APIの返り値はBase64文字列なので、UTF8に変換する必要があります。 []