JShellからSendGridでメール送信する

Java

SendGridサポートエンジニアの菊田(@kikutaro_)です。早いものでSendGridチームにジョインしてから半年が経ちました。以前、開発者だったときは、プログラミング言語としてJavaを主に利用していたのですが、最近では触る機会が少し減ってきています。Javaは今年、Java SE 9、Java EE 8のリリースが予定されているので、新しい機能を中心にまた色々と触っていきたい所です。

既にJava SE 9のJDK(Java Development Kit)やJRE(Java Runtime Environment)はEarly Access版が公開されているため、実際に新しい機能を試すことができます。そこで本日は、Java SE 9で新しく追加されるJShellを使ってSendGridのライブラリを動かしてみたいと思います。

JShellとは?

JShellとはJavaを対話的に評価・実行するツールで、いわゆるREPL(Read-Eval-Print Loop)に該当します。

現在Javaを動かすには、ソースコードをコンソールやIDEからコンパイルして実行する必要があります。ちょっとした簡単なコードを試す場合、スクリプト言語などに比べるとどうしても手間がかかってしまっていました。しかし、Java SE 9からは、JShellを利用してスクリプト感覚でJavaを実行することができるようになります。

JShellに関する詳しい解説はJava Championである櫻庭 祐一さんが執筆されている以下の記事を参照してください。
最新Java情報局
Java SE 9で導入される「Project Kulla」、便利なREPLツール
Java SE 9のProject Kulla、JShellを深く知る
Java SE 9で導入されるJShellの組み込みコマンドを知る
Java SE 9のProject Kulla、JShellの動作とJShell API
Java SE 9のProject Kulla、JShellとIDE
Java SE 9のProject Kulla、コンソールアプリケーションのためのJLine
※連載ですので上記以外のJShell関連記事が増えることがあります。

百聞は一見に如かず、ですので実際に試してみましょう。以下は「Hello, World!」を標準出力するJavaコードをJShellで実行した例(※1)です。

C:\Users\kikutaro>jshell
|  JShellへようこそ -- バージョン9-ea
|  概要については、次を入力してください: /help intro

jshell> System.out.println("Hello, World!")
Hello, World!

jshellコマンドでJShellを起動後、すぐにJavaのコードを実行することができます。JShelではプログラム実行の起点となるmainメソッドやそれを持つクラスの宣言が不要なのでお手軽です。

コンソールでTabキーを押すとコード補完も行われますので、IDEがなくてもある程度のコーディングが可能です。

jshell> System.out.print
print(     printf(    println(

「/exit」コマンドでJShellは終了できます。

jshell> /exit
|  終了します

お試しコードの動作確認をしたい場合や、教育などで活用すると便利そうですね。

JShellからSendGridを利用する

JShellは色々な活用方法があると思いますが、個人的にはOSSで公開されているライブラリの動作確認などに良さそうだな、と思っています。そこで今回はSendGridのJavaライブラリであるsendgrid-javaをJShellから使ってみたいと思います。

sendgrid-javaでは、必要な依存ライブラリを全て含んだjarファイル(fat jar)が公開されているので、今回はこちらをダウンロードして利用します(※2)。

JShellでは起動オプションを利用してクラスパスの指定が可能です。javaコマンドでは「-cp」ですが、JShellでは「–class-path」となっているのでご注意ください。

C:\Users\kikutaro\sendgrid>jshell --class-path sendgrid-java-3.2.0-jar.jar
|  JShellへようこそ -- バージョン9-ea
|  概要については、次を入力してください: /help intro

jshell>

なお、起動オプションではなく、JShellを起動した後でも「/env」コマンドで次のようにクラスパスを指定することもできます。

jshell> /env --class-path sendgrid-java-3.2.0-jar.jar
|  新しいオプションの設定と状態の復元。

それでは、JShellでsendgrid-javaのGitHubにあるサンプルコードを試してみましょう。

まずはimport文でcom.sendgrid配下のパッケージ・クラスをimportします。これによりsendgrid-javaおよび依存関係にあるjava-http-clientライブラリで定義されたクラスを利用することができるようになります。

jshell> import com.sendgrid.*

サンプルコードの処理内容を記述していきます。送信元メールアドレス、送信メールのタイトル、宛先メールアドレス、メール内容をそれぞれ設定します。

jshell> Email from = new Email("kikutaro_from@example.com")
from ==> com.sendgrid.Email@5f9d02cb

jshell> String subject = "SendGridのJavaライブラリ を利用してメール送信"
subject ==> "SendGridのJavaライブラリを利用してメール送信"

jshell> Email to = new Email("kikutaro_to@example.com")
to ==> com.sendgrid.Email@23e028a9

jshell> Content content = new Content("text/plain", "こんにちは!")
content ==> com.sendgrid.Content@5c5a1b69

記述や文法のミスがあると、その場でエラーがわかりますし、このように1行1行コードの意味を確認しながら写経して、そのまま実行できるのはとても良いですね。

続いて上記で設定した情報からMailクラス、API KeyからSendGridクラスのインスタンスをそれぞれ生成し、リクエストを生成してメール送信を行います。

jshell> Mail mail = new Mail(from, subject, to, content)
mail ==> com.sendgrid.Mail@3901d134

jshell> SendGrid sg = new SendGrid("***API Keyを入力***")
sg ==> com.sendgrid.SendGrid@169bb4dd

jshell> Request request = new Request()
request ==> com.sendgrid.Request@2d0399f4

jshell> request.method = Method.POST
$9 ==> POST

jshell> request.endpoint = "mail/send"
$10 ==> "mail/send"

jshell> request.body = mail.build()
$11 ==> "{\"from\":{\"email\":\"kikutaro@example.com\"},\"subject\":\"SendGridのJavaライブラリを利用してメール送信\",\"personalizations\":[{\"to\":[{\"email\":\"kikutaro_to@example.com\"}]}],\"content\":[{\"type\":\"text/plain\",\"value\":\"こんにちは!\"}]}"

jshell> Response response = sg.api(request)
response ==> com.sendgrid.Response@21a21c64

responseに格納された結果もその場で色々な値を自由に確認できるので便利です。

jshell> System.out.println(response.statusCode)
202

jshell> System.out.println(response.headers)
{X-Frame-Options=DENY, Server=nginx, Access-Control-Allow-Origin=https://sendgrid.api-docs.io, Access-Control-Allow-Methods=POST, Connection=keep-alive, X-Message-Id=9ewHvWI3SSGuwgPtLULW8A, X-No-CORS-Reason=https://sendgrid.com/docs/Classroom/Basics/API/cors.html, Content-Length=0, Access-Control-Max-Age=600, Date=Tue, 28 Mar 2017 06:27:37 GMT, Access-Control-Allow-Headers=Authorization, Content-Type, On-behalf-of, x-sg-elas-acl, Content-Type=text/plain; charset=utf-8}

今回はsendgrid-javaを題材にJShellでの実行を試しましたが、同じ要領で自由にJavaライブラリの動作確認ができると思います。是非トライしてみてください。