Kiiを使ってスマホアプリからメールを送信する方法

Kiiロゴ

今回は、「Kii」というMBaaS(Mobile Backend as a Service)を使ってスマホアプリからメールを送信する方法をご紹介します。

はじめに

Kiiは、スマホアプリの開発において、(特にサーバ側で)必要となる次のような機能を提供しています。

  • ユーザー管理
  • データ管理
  • プッシュ通知
  • 位置情報提供
  • サーバー機能拡張
  • アプリ分析
  • A/Bテスト
  • モノ管理

また、次のプラットフォームをサポートしています。

  • Android
  • iOS
  • Web
  • Unity

例えば、AndroidやiPhone上のスマホアプリで発生したイベントをトリガとしてメールを送信する場合、技術的にはスマホアプリからSendGridのAPIを直接コールして送信することもできますが、認証情報をアプリ内に埋め込むことはセキュリティ的にNGです。こういったケースでは、サーバーサイドの実装が必要になります。Kiiではサーバーサイドのコード実行機能として「サーバー機能拡張」という機能が提供されています。これを利用して、サーバーサイドにメール送信機能を実装し、スマホアプリからKiiのAPIを通じて呼び出します。こうすることで、安全にコードを実行できます。

準備

今回はKiiチュートリアルアプリ(Android版)にメール送信機能を追加します。事前に次のものが必要になります。

サーバーコードの実装

まず、Kiiのサーバー機能拡張上で実行されるサーバーコードの実装から始めます。テキストエディタで次のようなsendmail関数を作成(ファイル名:server.js)します。次の箇所は環境に合わせて編集してください。

  • YOUR_API_KEY:SendGridのAPI Key(Mail SendへのFULL ACCESSパーミッションが必要)
  • RECIPIENT_ADDRESS:宛先アドレス。今回はクライアントサイドのイベントを管理者向けに通知する想定です。
  • FROM_ADDRESS:送信元アドレス
function sendmail(params, context) {
  var apiKey = 'YOUR_API_KEY';
  var to = 'RECIPIENT_ADDRESS';
  var from = 'FROM_ADDRESS';
  var data = {
    to: to,
    from: from,
    subject: '戦績表示[' + params.username + ']',
    text: '提督!You’ve Got Mail!Love letterは許さないからネ!',
    html: '<html><body>提督!You’ve Got Mail!Love letterは許さないからネ!</body></html>'
  };
  $.ajax({
    url: 'https://api.sendgrid.com/api/mail.send.json',
    type: 'POST',
    dataType: 'json',
    data: data,
    beforeSend: function(xhr) {
      xhr.setRequestHeader('Authorization', 'Bearer ' + apiKey);
    }
  }).complete(function(XMLHttpRequest, textStatus) {
    console.log('complete: ' + textStatus);
  }).fail(function(XMLHttpRequest, textStatus) {
    console.log('fail: ' + textStatus);
  });
}

コードのデプロイ

次に、先ほど実装したコードをサーバー機能拡張にデプロイします。管理コンソールにログインしてデプロイに必要な各Access Key(APP_ID、API_KEY、CLIENT_ID、CLIENT_SECRET)を確認します。

コンソール画面で「Kii Tutorial」を選択します。
Kii Apps画面

画面右上の鍵アイコンを選択すると各Access Keyを確認できます。
Kii Access Keys画面

デプロイはKii Command Line Interfaceに含まれる「kii-servercode.js」で行います。以下のコマンドはKii Command Line Interfaceがkii-cli-v1.3.0に格納されている前提です。各Access Keyを先ほど確認した値に置き換えます。

$ node ../kii-cli-v1.3.0/bin/kii-servercode.js deploy-file --file ./server.js --site us --app-id APP_ID --app-key API_KEY --client-id CLIENT_ID --client-secret CLIENT_SECRET

次のような結果が表示されたらデプロイ成功です。

30 Nov 17:05:42 - Deploying file...
30 Nov 17:05:43 - File deployed as version iz5s80qoith2fd8yqg3di1pn
30 Nov 17:05:43 - Setting current version to iz5s80qoith2fd8yqg3di1pn...
30 Nov 17:05:43 - Current version set to iz5s80qoith2fd8yqg3di1pn

Androidアプリの実装

次に、Androidアプリにサーバーコードの実行のための実装を追加していきます。Kiiチュートリアルアプリのcom.kii.android.sdk.tutorialパッケージ内にServerCodeCallerクラスを追加します。ServerCodeCaller#sendmail()メソッドは、先ほどサーバー機能拡張にデプロイしたsendmail関数をユーザー名をパラメータとして呼び出します。

package com.kii.android.sdk.tutorial;

import com.kii.cloud.storage.Kii;
import com.kii.cloud.storage.KiiServerCodeEntry;
import com.kii.cloud.storage.KiiServerCodeEntryArgument;
import com.kii.cloud.storage.KiiServerCodeEntryCallback;
import com.kii.cloud.storage.KiiServerCodeExecResult;

import org.json.JSONException;
import org.json.JSONObject;

public class ServerCodeCaller {
   public static void sendmail(String username) throws JSONException {
       // Set the custom parameters.
       JSONObject rawArg = new JSONObject();
       rawArg.put("username", username);
       KiiServerCodeEntryArgument arg = KiiServerCodeEntryArgument.newArgument(rawArg);

       // Execute the Server Code
       KiiServerCodeEntry entry = Kii.serverCodeEntry("sendmail");
       entry.execute(arg, new KiiServerCodeEntryCallback() {
           public void onExecuted(KiiServerCodeEntry entry, KiiServerCodeEntryArgument argument,
                                  KiiServerCodeExecResult res, Exception exception) throws JSONException {
               if (exception != null) {
                   // Error handling
                   return;
               }
           }
       });
   }
}

最後に、ログイン処理でこのメソッドを呼び出すようにします。具体的にはLoginFragmentクラス内のKiiUserCallBack#onLoginCompleted()イベント内に追記します。

KiiUserCallBack callback = new KiiUserCallBack() {
   @Override
   public void onLoginCompleted(int token, KiiUser user, Exception e) {
       setFragmentProgress(View.INVISIBLE);
       if (e == null) {
           // execute server code
           try {
               ServerCodeCaller.sendmail(user.getUsername());
           } catch (Exception je) {
               // Error handling
               je.printStackTrace();
           }
           //
           showAlert(R.string.user_loggedIn,
                   "User logged in succesfully.nNow lets create an object to kiicloud!",
                   listener);
           :
           :

動作確認

Kiiチュートリアルアプリを実行してSignupまたはLoginするとサーバーコード内で設定した宛先にメールが送信されます。

Androidアプリ

メール

さいごに

MBaaSを活用することでスマホアプリを組み込んだシステムに必要な基本機能の実装を大幅に省略することができます。また、Kiiはサーバー機能拡張という非常に強力な機能に加え、アプリ分析、A/Bテスト、IoT対応など独特の機能も提供しています。ぜひお試しください!