Cloud Functions for Firebase × TypeScript でメールを送信する

Cloud Functions for FirebaseはGoogle Cloud PlatformのCloud FunctionsをよりFirebaseと連携しやすくしたサービスです。いわゆるFaaS(Function As a Service)で、サーバレスで実行環境を構築できます。

今回はこのCloud Functions for Firebaseを使ってCustomers Mail Cloudでメール送信を行う方法を紹介します。

Customers Mail Cloudの設定

まずはCustomers Mail Cloudにて送信サーバの設定を行います。

ユーザ登録

ユーザ登録はまず、メールアドレスとパスワードを入力するところからはじまります。

f:id:moongift:20190510151017p:plain
ユーザ登録

入力したメールアドレス宛にメールアドレスの確認メール(仮登録受付メール)が届きますので、URLをクリックします。その後、名前や住所といった必要な情報を入力します。ユーザ登録が完了すると、無料トライアル開始のための審査が入ります。時間は長くとも30分程度です。「Customers Mail Cloud 無料トライアル利用開始のご案内」というメールが届いたら利用できます。

ログイン後に行うこと

ログインしたら、2つの作業を行う必要があります。

f:id:moongift:20190510150911p:plain
ダッシュボード

DKIMキーを設定する

DKIMキーはメールのなりすましを防止するための技術になります。メール配信を行うドメインのTXTレコードに対して設定します。管理コンソールでドメインを追加しようとすると、専用のキーが表示されます。

f:id:moongift:20190510150735p:plain
DKIMキーの取得

ドメインは s999999999999._domainkey.example.com のような形式になります。設定する値は v=DKIM1; p=MIG...QAB のように指定されるはずです。この設定はシステム管理者などに依頼して行ってもらってください。

DNS設定はすぐに反映されませんので、数分後にDNSを確認ボタンを押します。正しく設定されていれば、ドメインが追加登録できます。

ユーザを追加する

次にメール配信を行うユーザを追加します。これはAPI設定にて行います。ユーザ名(メールアドレス形式)、パスワードを設定します。また、利用できる機能を制限できます。例えばSMTPのみ、APIのみといった指定も可能です。

f:id:moongift:20190510150841p:plain
ユーザの追加

サーバに設定を反映する

設定を行ったら、それをサーバに反映します。サーバ構成機能にて行います。この反映を行わないと、DKIMやユーザ追加設定が反映されませんので注意してください。ここまでで以下の情報が入手できているはずです。

  • APIユーザ
  • APIキー

さらにAPIサーバのエンドポイントURLが必要です。これは契約しているプランによって異なりますのでご注意ください。

プラン名 エンドポイントURL
無料トライアル https://sandbox.smtps.jp/api/v2/emails/send.json
Standardプラン https://te.smtps.jp/api/v2/emails/send.json
Proプラン https://SUBDOMAIN.smtps.jp/api/v2/emails/send.json

これらの情報はメール送信時に設定しますので覚えておいてください。

CLIツールのインストール

Firebase用のCLIツールをインストールします。

npm install -g firebase-tools

プロジェクトの作成

Cloud Functions for Firebaseにアクセスして、プロジェクトを作成します。

f:id:moongift:20190807142115p:plain
プロジェクトの作成

ウィザードに沿っていくだけで、初期設定が完了します。

f:id:moongift:20190807142206p:plain
ウィザード

次にターミナルを立ち上げて、以下のコマンドでFirebaseにログインします。

firebase login

ログイン後、プロジェクトのベースを作成します。

firebase init

プロジェクトは以下のような構成になっています。今回はTypeScriptを採用しています。

$ tree -I node_modules
.
├── package-lock.json
├── package.json
├── src
│   └── index.ts
├── tsconfig.json
└── tslint.json

1 directory, 5 files

環境設定を行う

API経由でメール送信を行う際に使うAPIユーザ、APIキー、さらに契約状態によって異なるAPIエンドポイントURLは環境変数として定義します。以下のコマンドで登録できます。それぞれの値は皆さんの設定のものに書き換えてください。

$ firebase functions:config:set \
  customers_mail_cloud.api_user="api@smtpd.jp" \
  customers_mail_cloud.api_key="API_KEY" \
  customers_mail_cloud.endpoint="https://sandbox.smtps.jp/api/v2/emails/send.json"

きちんと設定できているかどうかは firebase functions:config:get で確認できます。

$ firebase functions:config:get
{
  "customers_mail_cloud": {
    "api_key": "API_KEY",
    "api_user": "api@smtpd.jp",
    "endpoint": "https://sandbox.smtps.jp/api/v2/emails/send.json"
  }
}

コードについて

src/index.ts について解説します。HTTPリクエストを行うので、 superagent をインストールします。また、TypeScriptなので @types/superagent もインストールします。

$ npm i superagent -S
$ npm install @types/superagent -D

まず superagent を読み込みます。

import * as functions from 'firebase-functions';
import request from 'superagent';

次に、メールアドレスとリクエスト時のパラメータに関するインタフェースを定義します。

interface Email {
  name :string,
  address: string
}

interface RequestParameter {
  api_user: string,
  api_key: string,
  to: Email[],
  from: Email,
  subject: string,
  text: string
}

後はCloud Functions for Firebaseがリクエストされた時の処理を記述します。具体的には下記の関数の中に記述します。

export const helloWorld = functions.https.onRequest(async (req, res) => {
  // ここに処理を記述
});

処理内容

今回はPOSTメソッドだけを対象にします。

if (req.method !== 'POST') {
  res.status(405).send('Invalid http method.');
} else {
  // 処理を記述
}

次に送信先、送信元を定義します。送信先はリクエストボディで指定できるようにします。

const to: Email[] = [{
  name: req.body.name,
  address: req.body.email
}];
const from: Email = {
  name: 'Customer Cloud Mail Admin',
  address: 'info@smtpd.jp'
};

件名と本文です。リクエストボディで指定できるようにしても良いですが、今回は固定にしました。

const subject: string = 'テストメール';
const text: string = `このメールはテストメールです。
改行を入れます。

----
フッターです
`;

Customers Mail Cloudにリクエストする内容を作ります。 functions.config() で環境変数を取得できます。

const params: RequestParameter = {
  api_user: functions.config().customers_mail_cloud.api_user,
  api_key: functions.config().customers_mail_cloud.api_key,
  to: to,
  from: from,
  subject: subject,
  text: text
};

そしてメール送信APIを呼び出します。この処理は Node.jsでメールを送信する で書いている通りです。

try {
  // 送信処理
  const result: request.Response = await request
    .post(functions.config().customers_mail_cloud.endpoint)
    .send(params);
  res.send(result.body);
} catch (e) {
  // エラーの場合
  res.status(503).send(e.response.body);
}
res.send("Hello from Firebase!");

デプロイする

Cloud Functions for Firebaseへのデプロイは以下のコマンドで行えます。

$ firebase deploy

初回実行時に専用のURLが生成されます。例えば https://us-central1-example.cloudfunctions.net/mail とします。このURLは管理画面でも確認できます。

f:id:moongift:20190807141950p:plain
Cloud FunctionsのURLを確認

メール送信を試す

では実際にメールを送信してみます。

curl -X POST -H "Content-Type: application/json" \
  -d '{"name":"テストカスタマー", "email":"user@stmpd.jp"}' \
  https://us-central1-example.cloudfunctions.net/mail

問題なければ以下のように結果が返ってきます。

{"id":"<2106857532.1251.1565150810829@mta02.sandbox.smtps.jp>"}

まとめ

Cloud Functions for Firebaseはアプリと手軽に連携できるプラットフォームです。Customers Mail Cloudと組み合わせることで、サーバレスでのメール送信が簡単にできます。ぜひお試しください!

クラウドからのメール送信を簡単に。確実に。| Customers Mail Cloud