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

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

次にフォームを送信した際の処理として、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の管理画面で作成します。

| 名称 | 変数名 |
|---|---|
| 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);
}
試す
実装がうまくいっていれば、お問い合わせフォームからメール送信が行えるはずです。

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