Next.jsとVercelで作ったフォームからSendGridでメール送信する方法
- 2021年7月16日
- by 菊田 洋一
- Category: 技術ネタ
SendGridサポートエンジニアの@kikutaro_です。最近フロントエンドの技術を触るとき、ホスティング先として「Vercel」を使っています。Next.jsやNust.jsなどで作ったアプリを簡単にデプロイできて、サーバレス機能も備えている便利なサービスです。
今回のブログでは下図のような仕組みのお問合せフォームを作ります。Next.jsでフォームとメール送信機能(SendGridを利用)を実装してVercel上で動かします。

環境準備
Node.js 12以上が入った環境を用意します。記事ではDocker上のAlpine LinuxにNode.js 14.17.1を入れた環境を使いました。
最初にNext.jsのプロジェクトを作成します。
npx create-next-app
プロジェクト名は自由です。ここではvercelformと名づけました。

完了したら以下のコマンドを実行してWebアプリケーションを起動します。
yarn dev
http://localhost:3000/ にアクセスして以下の画面が表示されたら環境の準備は完了です。

メール送信機能の実装
Webフォームを作る前にメール送信機能を実装していきます。まずは以下のコマンドでSendGridライブラリを環境に追加します。
npm install --save @sendgrid/mail
メール送信機能はWeb APIとして実装します。作成したプロジェクトのpages/apiの配下にsend.jsを作成してください。

send.jsに以下の内容を反映します。4行目の「SG.xxx」はSendGridで発行したAPIキーに置き換えてください。6~12行目でフォームに登録された宛先(req.body.email)とメッセージ(req.body.message)を送信リクエストに設定して、16行目でメールを送信しています。
export default function handler(req, res) {
if(req.method === 'POST') {
const sgMail = require('@sendgrid/mail');
sgMail.setApiKey("SG.xxx"); //SendGridのAPIキー
const msg = {
to: req.body.email,
from: 'support@example.com',
subject: 'お問合せありがとうございました。',
text: 'お問合せを受け付けました。回答をお待ちください。' + req.body.message,
html: 'お問合せを受け付けました。回答をお待ちください。' + req.body.message,
};
(async () => {
try {
await sgMail.send(msg);
} catch (error) {
console.error(error);
if (error.response) {
console.error(error.response.body)
}
}
})();
}
res.status(200)
}
フォームの作成
続いてフォームを作成しましょう。プロジェクトの中にあるpages配下にform.jsを追加します。

form.jsには次の2つを実装します。
- フォームのHTML
- ボタンを押したときの処理
2では先ほど作成したAPIを呼び出します。
export default function Form() {
const registerUser = async event => {
event.preventDefault()
const res = await fetch('/api/send', {
body: JSON.stringify({
email: event.target.email.value,
message: event.target.message.value
}),
headers: {
'Content-Type': 'application/json'
},
method: 'POST'
})
const result = await res.json()
}
return (
<div className="container mt-5">
<form onSubmit={registerUser}>
<div className="mb-3">
<label htmlFor="email">メールアドレス</label>
<input id="email" name="email" type="email" className="form-control" placeholder="name@example.com"/>
</div>
<div className="mb-3">
<label htmlFor="message" className="form-label">問合せ内容</label>
<textarea id="message" name="message" className="form-control" rows="3"></textarea>
</div>
<div className="mb-3">
<button type="submit" className="btn btn-primary">送信</button>
</div>
</form>
</div>
)
}
今回、フォームのデザインにBootstrapを使います。以下のコマンドで環境に追加します。
npm install bootstrap@next
pages配下にある_app.jsでBootstrapをimportします。
import 'bootstrap/dist/css/bootstrap.min.css';
import '../styles/globals.css'
function MyApp({ Component, pageProps }) {
return <Component {...pageProps} />
}
export default MyApp
http://localhost:3000/form にアクセスして以下のようなフォームが表示されたら実装は完了です。

表示されたフォームに入力してメールが届くことを確認しましょう。
Vercelにデプロイする
ローカル環境で動くことが確認できたら、Vercelにデプロイしましょう。最初にVercel CLIをインストールします。
npm i -g vercel
続いてvercelコマンドを実行します。認証が求められたらVercelのアカウントでログインしてください。認証後、再度vercelコマンドを実行するとデプロイが始まります。
vercel
プロジェクト名など必要な情報を入力するとデプロイが行われ、URLが発行されます。

URLにアクセスしてローカル環境と同じ画面・動作が確認できたら成功です。
おわりに
今回はフォームを例にNext.jsとVercelを使ってSendGridから通知する方法をご紹介しました。バックエンドの実装も簡単にできる仕組みなので、今回のようにフロントエンドのフォームとバックエンドのメール送信を連携する場合に便利です。ぜひお試しください。


