はじめに
ASTERIA WarpのRESTコンポーネントでGMail APIを使ってメール送信する方法を考えてみました。
環境
- OS: Windows10
- Java:1.8.0.241
- ASTERIA Warp : 1912
事前準備・前提
フローは、AccessToken、RefreshTokenありきでひとまず考えてみています。
クライアントIDやクライアントシークレット、AuthorizationCode含め、AccessToken、RefreshTokenの取得は事前準備として行なっておきます。
scopeはひとまず以下を指定しておきました。
https://www.googleapis.com/auth/gmail.readonly
https://www.googleapis.com/auth/gmail.send
フロー
フローの流れ
主な流れは
- AccessTokenの検証
- AccessTokenの期限が切れていたらRefreshTokenから生成
- メール送信データを作成
- From、To、Subject、本文などを設定
- base64でエンコード
- JSONに変換
- GMail APIでメールを送信
です。それぞれの処理について掘り下げて説明していきます。
AccessTokenの検証
AccessTokenの検証は
https://www.googleapis.com/oauth2/v3/tokeninfo?[アクセストークン]
のHTTPステータスをBranchStartで判断してみています。
200 OK
以外の場合は期限切れとみなしてRefreshTokenを使って再取得しています。
RefreshTokenからAccessTokenの生成
RefreshTokenからAccessTokenを生成するときは
https://accounts.google.com/o/oauth2/token
へ以下のフォームデータでPOSTするらしいので
- client_id
- client_secret
- refresh_token
- grant_type
RESTの入力ストリームをParameterListにしてPOSTするようにしてみました。
レスポンスはJSONなのでここでは出力ストリームをXML
にして生成したaccess_tokenをフロー変数に格納しています。
メール送信データを作成
1. From、To、Subject、本文を設定
2. base64でエンコード
Base64Encodeを使って全体をエンコード。
改行文字を削除プロパティははい
にしています。
3. JSONに変換
JSONEncodeでJSONに変換。
{raw:[base64文字列]}
としたかったのでParameterListを入力ストリームにしています。
GMail APIでメールを送信
https://www.googleapis.com/gmail/v1/users/me/messages/send
へ作成したJSONをそのまま差し込んでいます。
送信ヘッダーは以下のように設定しています。
ヘッダー名 | 値 |
---|---|
Authorization | Bearer ${flow.AccessToken} |
Content-Type | application/json |
Accept | application/json |
以上でフローは完成です。
フローの実行
無事にメール送信できているようです。
番外編
AuthorizationCodeからAccessTokenとRefreshTokenを取得する部分はRESTコンポーネントで設定すると以下のような感じです。
URL:
https://accounts.google.com/o/oauth2/token
入力ストリーム:ParameterList
- client_id
- client_secret
- redirect_uri
- grant_type
- code
redirect_uriとgrant_typeは固定でurn:ietf:wg:oauth:2.0:oob
とauthorization_code
を指定しています。
RefreshTokenから生成するときと似たような設定内容です。

その他雑感
今のままだとほぼ毎回RefreshTokenからAccessTokenを生成することになるのでまだまだ改良の余地はあると思っています。
トークンをAESで暗号化してファイル保存しておいて取り出すときは複合化するといった処理を入れるともっと本格的ですよね。
AuthorizationCodeは一度しか取得しないと思うので最初にブラウザーからアクセスして取得するのが簡単だと思います。
CodeからAccessTokenとRefreshTokenを取得する部分はRESTコンポーネントでもできそうですが、AuthorizationCodeを使って一度取得するとそのCodeは数分くらいで使えなくなってしまうようなので、実質最初にRefreshTokenを取得するために1回実行するくらいかと思います。
curlで実行している例はたくさん見かけましたので、それを参考にRESTコンポーネントで組み立ていくとわかりやすかったです。
Javaのライブラリとしても提供されているのでJavaInterpreterで書いてみるのもよいかもしれません。
終わりに
AccessToken、RefreshTokenさえあれば意外と単純なフローになりました。時間があればファイル添付やメール受信もやってみたいなと思っています。