🙄
sendgridとfirebase cloud functionsでメール作成
メール送信の一例を投稿しました。
以下パターンを作成しました。
順番は簡単にできる順です。
- httpリクエストよりメール受信
- 問い合わせフォームからのメール受信
- メール文をテンプレート化してメール受信
- 自動返信
前提
環境
- node
- firebase v9 cloud functions
- sendGrid
- axios
- vue3
準備
- 環境構築は割愛
- sendgridはログインできること
- firebase cloud functionsはhttpリクエストが出来る状態であること
内容
httpリクエストよりメール受信
1.sendgridより、apiKey取得
- ログイン後の画面から、Settings Api Key1をクリック
- Create API Keyをクリック
- Api Key Name入力して、Create&Viewをクリック
- Api Keyをコピー(あとで使いますので、メモ等にて保存しといてください)
2.cloud functions用のコード
const functions = require("firebase-functions");
const sgMail = require('@sendgrid/mail')
exports.sendMail=functions.https.onRequest(async (req,res)=>{
sgMail.setApiKey('*******************') //←sendgirdで生成したApi Key
res.set('Access-Control-Allow-Origin', '*');
const msg = {
to: '****@****.***', //←受信したいメールアドレス
from: req.query.mail,
subject: '問い合わせ',
text: req.query.content,
html: `<strong>${req.query.content}</strong>`,
}
sgMail
.send(msg)
.then(() => {
res.send('成功')
})
.catch((error) => {
res.send('失敗',error)
})
})
3.ブラウザから送信
cloud functionsで作成したリクエストhttps://~の後ろに、
?name=hibimosaku&mail=aaa@aaa.jp&content=test
つけて送信
4.結果
問い合わせフォームからのメール受信
1.vueのソースコード
<template>
名前<input type="text" v-model="name"><br>
メール<input type="email" v-model="email"><br>
内容<input type="text" v-model="content"><br>
<button @click="submit">メール送信</button>
</template>
<script>
import { ref } from "vue";
import axios from "axios"
export default({
setup() {
const name=ref()
const email=ref()
const content=ref()
const submit=()=>{
axios({
baseURL: "https://us-central1********",//←上で作成したfunctionsのURL
method: 'post',
params:{
name:name.value,
mail:email.value,
content:content.value
}
})
.then(()=>{
console.log('成功')
})
.catch((e)=>{
console('失敗',e)
})
}
return{
name,
email,
content,
submit
}
},
})
</script>
2.作成したフォームから送信
3.結果
メール文をテンプレート化してメール受信
1.sendgridでのテンプレート作成
1-1.Legacy Templatesをクリック
1-2.Create Templateをクリックして、nameを入力後、Add Versionをクリック
1-3.code Editorを選択して、Continueをクリック
1-4.以下コードを入力して、Save Templateをクリックして、「←」をクリック
<html>
<head>
</head>
<body>
{{name}}様より問い合わせがありました。。
<br /><br/>
<p>内容</p>
<p>{{content}}</p>
<br /><br/>
</body>
</html>
1-5. 作成後id取得(メモ等にコピーして保存)
2.cloud functions コード作成
const functions = require("firebase-functions");
const sgMail = require('@sendgrid/mail')
exports.sendMail=functions.https.onRequest(async (req,res)=>{
sgMail.setApiKey('*******************') //←sendgirdで生成したApi Key
sgMail.setSubstitutionWrappers('{{', '}}');
res.set('Access-Control-Allow-Origin', '*');
const msg = {
to: '****@****.***', //←受信したいメールアドレス
from: req.query.mail,
subject: '問い合わせ',
text: req.query.content,
html: `<strong>${req.query.content}</strong>`,
template_id: '***************', //←1-5.で取得したid
substitutions: {
name: req.query.test,
},
}
sgMail
.send(msg)
.then(() => {
res.send('成功')
})
.catch((error) => {
res.send('失敗',error)
})
})
3.vueコード
「問い合わせフォームからのメール受信」と同じ
4.作成したフォームより送信
5.結果
自動返信
- sendgrid テンプレート作成
作成方法は、「メール文をテンプレート化してメール受信」を参照
<html>
<head>
</head>
<body>
{{name}}様。
<br /><br/>
<p>いつもお世話になっております。</p>
<p>内容受け付けました</p>
<p>回答は改めてご連絡いたします。</p>
<br /><br/>
<p>問い合わせ内容</p>
<p>{{content}}</p>
</body>
</html>
- cloud functions作成
const functions = require("firebase-functions");
const sgMail = require('@sendgrid/mail')
exports.sendMail=functions.https.onRequest(async (req,res)=>{
sgMail.setApiKey('******************') //←sendgirdで生成したApi Key
sgMail.setSubstitutionWrappers('{{', '}}');
res.set('Access-Control-Allow-Origin', '*');
//メール受信内容
const msgRecieve = {
to: '*********', //受信先のメールアドレス
from: req.query.mail, //問い合わせ先からのメール
subject: `${req.query.name}様からの問い合わせ`,
text: req.query.content,
html: `<strong>${req.query.content}</strong>`,
}
//メール自動返信内容
const msgReply = {
to: req.query.mail, //自動返信先のメールアドレス
from: '*************', //受信先のメールアドレス
subject: `問い合わせありがとうございます`,
// text: req.query.content,
// html: `<strong>${req.query.content}</strong>`,
template_id: '3bfa8e5c-6e02-4cc4-9b64-fe2ba14aeac1',
substitutions: {
name: req.query.name,
content:req.query.content
},
}
await sgMail.send(msgRecieve)
await sgMail.send(msgReply)
.then(() => {
res.send('成功')
})
.catch((error) => {
res.send('失敗',error)
})
})
3.vueコード
「問い合わせフォームからのメール受信」と同じ
4. 作成したフォームより送信
5. 結果
- 受信メール
- 自動返信メール
以上になります
Discussion
sendgridとfirebase cloud functionsでメール作成
大変参考になりました。
表示さた、cloud functions用のコードを転記し、
sendgirdで生成したApi Keyを入れて
firebase deploy --only functionsでデプロイしましたが
デプロイ後のurlが取得できません 。
他のfunctionではデプロイ後にエラー無く、urlが取得できるのですが?
環境構築に問題があるのでしょうか?
こちらで問い合わせしてよろしいのでしょうか。
tomosue様
問い合わせありがとうございます。
環境構築を記載してなく、分かりづらく申し訳ございません。
原因が分からず、回答が違うかもしれませんが、
functionsのpackage.jsonの中に
@sendgrid/mail
はありますでしょうか?ない場合は、funcitonsフォルダに移動して、
npm i @sendgrid/mail
でインストールすれば解決すると思います。よろしくお願いします。
返事、遅くなりました。
いろいろ試しました。
漸くurlが取得できました。
以下、試行ステップを記します。
お世話かけました。
私のfirebase プロジェクトは、去年の前半の環境で、
firebase sdkが8.**でした。
そのプロジェクトを、新規作業フォルダーから
firebase deploy --only functionsでデプロイしました。
urlが取得できませんでした。
現在の、firebase sdkが9.**の環境で、新たにfirebaseプロジェクトを作成し、
firebase deploy --only functionsでデプロイしました 。
urlが取得できました。
ご返信ありがとうございます。
私の回答ずれてました。申し訳ございません。
試行ステップを記載していただきありがとうございます。
確かに私もfirebaseはv9で実施しました。
投稿の「環境」に書いておけばよかったです(修正しました)。
勉強になりました。