Cloudflare Workers × JavaScript でメールを送信する

Cloudflare WorkersはCloudflareの提供するFaaS(Function As a Service)で、サーバレスでスクリプトを実行できます。今回はこのCloudflare Workersを使って、Customers Mail Cloudでメール送信を行う方法を紹介します。

Customers Mail Cloudの設定

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

ユーザ登録

ユーザ登録はまずお問い合わせからはじめます。

ユーザ登録

ログイン後に行うこと

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

ダッシュボード

DKIMキーを設定する

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

DKIMキーの取得

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

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

ユーザを追加する

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

ユーザの追加

サーバに設定を反映する

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

  • APIユーザ
  • APIキー

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

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

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

Cloudflare Workersでサービスを作成する

CloudflareにログインしてWorkersのサービスを作成します。サービスを作成した後は、そのままCloudflare Workersにアクセスします。

コードについて

実際の開発時にはWrangler CLIを使うのが便利です。

$ npm install -g wrangler
$ wrangler login

ログインしたら、プロジェクトをインポートします。

wrangler init --from-dash YOUR_SERVICE_NAME

今回はTypeScriptを選んでいるので、 src/index.ts を編集します。

JavaScript SDKは利用しません

Cloudflare WorkersではNode.jsでなく、Webブラウザ互換のJavaScriptが動作します。そのため、ネットワークアクセスライブラリが動かないため、fetch関数を使います。

環境設定の追加

wrangler.toml に環境変数を追加します。それぞれご自身のものに書き換えてください。

[vars]
API_USER = "API_USER"
API_KEY = "API_KEY"
FROM_EMAIL = "info@example.com"
FROM_NAME = "Admin"

環境設定の型定義

以下はすべて src/index.ts への記述です。まず環境設定の型を定義します。

export interface Env {
  API_USER: string
  API_KEY: string
  FROM_EMAIL: string
  FROM_NAME: string
};

fetchへの追加

処理全体の基本形は次のようになっています。

export default {
  async fetch(request, env: Env) {
        // ここでメール送信処理を書く
        return await handleRequest(await result.json());
    }
}
async function handleRequest(message: object) {
  return new Response(JSON.stringify(message));
}

メール送信用のパラメーターを作成

メール送信に必要なパラメーターは次のようになります。今回はすべて固定ですが、ボディパラメーターで受け取った値を使うこともできます。

const url = 'https://te.smtps.jp/api/v2/emails/send.json';
const api_user = env.API_USER;
const api_key = env.API_KEY;
const to = [{
    name: 'John Doe',
    address: 'user@example.jp'
}];
const from = {
    name: env.FROM_NAME,
    address:  env.FROM_EMAIL
};
const subject = 'テストメール';
const text = `このメールはテストメールです。
改行を入れます。

----
フッターです
`;
const params = { api_user, api_key, to, from, subject, text };

リクエスト処理

後はパラメーターをまとめて、Customers Mail CloudのAPIリクエストを行います。

const params = { api_user, api_key, to, from, subject, text };
const method = 'POST';
const body = JSON.stringify(params);
const headers = {
    'Accept': 'application/json',
    'Content-Type': 'application/json'
};
// 送信処理
const result = await fetch(url, {method, headers, body});

デプロイする

デプロイはwranglerで行います。

wrangler publish

試す

APIのエンドポイントに対してPOSTリクエストを行ってみます。

curl -XPOST -d='{}' YOUR_WORKERS_URL

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

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

全体のコード

src/index.ts の内容は次のようになります。

export interface Env {
  API_USER: string
  API_KEY: string
  FROM_EMAIL: string
  FROM_NAME: string
};

export default {
  async fetch(request, env: Env) {
        const url = 'https://te.smtps.jp/api/v2/emails/send.json';
    const api_user = env.API_USER;
    const api_key = env.API_KEY;
    const to = [{
      name: 'John Doe',
      address: 'user@example.jp'
    }];
    const from = {
      name: env.FROM_NAME,
      address:  env.FROM_EMAIL
    };
    const subject = 'テストメール';
    const text = `このメールはテストメールです。
    改行を入れます。

    ----
    フッターです
    `;
    const params = { api_user, api_key, to, from, subject, text };
    const method = 'POST';
    const body = JSON.stringify(params);
    const headers = {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    };
    // 送信処理
    const result = await fetch(url, {method, headers, body});
    return await handleRequest(await result.json());
  }
}

async function handleRequest(message: object) {
  return new Response(JSON.stringify(message));
}

まとめ

Cloudflare Workersは手軽に連携できます。Customers Mail Cloudと組み合わせることで、サーバレスでのメール送信が簡単にできます。ぜひお試しください!

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