0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GMail APIを使用したRESTコンポーネントでのメール送信

Last updated at Posted at 2020-06-23

はじめに

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

フロー

GMailSend01.png

フローの流れ

主な流れは

  1. AccessTokenの検証
  • AccessTokenの期限が切れていたらRefreshTokenから生成
  • メール送信データを作成
    1. From、To、Subject、本文などを設定
    • base64でエンコード
    • JSONに変換
  • GMail APIでメールを送信

です。それぞれの処理について掘り下げて説明していきます。

AccessTokenの検証

AccessTokenの検証は

https://www.googleapis.com/oauth2/v3/tokeninfo?[アクセストークン]

のHTTPステータスをBranchStartで判断してみています。

GMailSend02.png

URLパラメーター
GMailSend03.png

BranchStart
GMailSend04.png

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するようにしてみました。

GMailSend05.png

レスポンスはJSONなのでここでは出力ストリームをXMLにして生成したaccess_tokenをフロー変数に格納しています。

GMailSend06.png

メール送信データを作成

1. From、To、Subject、本文を設定

MIMEEncodeを使って設定しています。
GMailSend07.png

2. base64でエンコード

Base64Encodeを使って全体をエンコード。
GMailSend08.png
改行文字を削除プロパティははいにしています。

3. JSONに変換

JSONEncodeでJSONに変換。
GMailSend09.png
{raw:[base64文字列]}としたかったのでParameterListを入力ストリームにしています。
GMailSend10.png

GMail APIでメールを送信

https://www.googleapis.com/gmail/v1/users/me/messages/send

へ作成したJSONをそのまま差し込んでいます。

GMailSend11.png

送信ヘッダーは以下のように設定しています。

ヘッダー名
Authorization Bearer ${flow.AccessToken}
Content-Type application/json
Accept application/json

GMailSend12.png

以上でフローは完成です。

フローの実行

GMailSend13.png

無事にメール送信できているようです。

GMailSend14.png

番外編

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:oobauthorization_codeを指定しています。
RefreshTokenから生成するときと似たような設定内容です。

GMailAPI10x.png

その他雑感

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

終わりに

AccessToken、RefreshTokenさえあれば意外と単純なフローになりました。時間があればファイル添付やメール受信もやってみたいなと思っています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?