Vercel と Customers Mail Cloud を連携してお問い合わせフォームを作る

静的サイトホスティングサービスが増えていますが、その中でも最近人気なのがVercelです。多種多様なフロントエンドフレームワークと連携する仕組みが用意されています。NetlifyやFirebase Hostingと比較している方も多いでしょう。しかし、Webサイトは静的な情報だけでは物足りないものです。たとえばお問い合わせフォームなど、動的な要素も組み込みたくなるでしょう。

f:id:moongift:20201026170421p:plain
Vercel

VercelにはFunctionsというサーバサイドでコードを実行できる機能が用意されています。今回はその機能を使ってお問い合わせフォームを作ってみました。

Hosting側の設定

まずVercelにて、HTMLでお問い合わせフォームを作ります。

f:id:moongift:20201026170333p:plain
お問い合わせフォーム

次にフォームを送信した際の処理として、APIを呼び出します。/api/ に入れるのが規定となっています。今回はJavaScript(Node.js)ですが、RubyやPythonなども使えます。

const d = document.querySelector;
await fetch('/api/contact.js', {
  method: 'post',
  body: JSON.stringify({
    email: d('#email').value,
    name: d('#name').value,
    body: d('#body').value。
  }),
  headers: {
    'Content-Type': 'application/json'
  }
});
alert('お問い合わせありがとうございます');

Functionsの設定

プロジェクトのルートで、ライブラリを追加します。package.jsonも作成しておいてください。

npm i customersmailcloud -S

次に環境変数を設定します。これはVercelの管理画面で作成します。

f:id:moongift:20201026170502p:plain
環境変数の設定

名称 変数名
APIユーザ API_USER
APIキー API_KEY
From(メールアドレス) FROM_ADDRESS

api/contact.jsを作成してコードを編集します。まずライブラリを読み込みます。

const { CustomersMailCloud } = require('customersmailcloud');

そして関数を定義します。

module.exports = async (req, res) => {
}

以下は関数の中の実装です。まず環境変数を使ってCustomers Mail Cloudを初期化します。

const client = new CustomersMailCloud(process.env.API_USER, process.env.API_KEY)

次にAPIのエンドポイントを選択します。 trial / standard / pro から選択します。

client.trial();

そしてメールを作成します。名前や本文はお問い合わせフォームから送られてきた情報を利用します。

const {email, name, body} = request.body;
client
  .setFrom('Admin', process.env.FROM_ADDRESS)
  .addTo(name, email)
  .setSubject('お問い合わせがありました')
  .setText(`お問い合わせ内容\n${body}`)

最後にメールを送信します。

try {
  const res = await client.send()
  response.send(res);
} catch (e) {
  response.send(e);
}

試す

実装がうまくいっていれば、お問い合わせフォームからメール送信が行えるはずです。

f:id:moongift:20201026170530p:plain
受信したメール

まとめ

Vercelを使えばGitリポジトリと連携して静的サイトを手軽にデプロイできます。また、Functionsを使うことで動的な機能も簡単に実装できます。同一ドメイン内であれば、CORSも気にすることはありません。VercelとCustomers Mail Cloudを組み合わせる際に参考にしてください。