我有一个
sendMail
云功能,我想用它从我网站上的联系表单发送电子邮件。该网站托管在 Firebase 上,并具有自定义 Google 域。问题是,每当我尝试从托管站点调用该函数时,都会收到此错误。
这是我迄今为止尝试过的
4.我也尝试过使用 cors 库来包装该函数,但这也不起作用:
这是我调用
sendMail
函数的方式:
handleSubmit = (e) => {
e.preventDefault();
const sendMail = firebase.app().functions('us-central1').httpsCallable("sendMail");
sendMail({ details: this.state })
.then((res) => {
this.setState({
loading: true,
});
this.notify("success");
})
.catch((error) => {
this.notify(error);
});
};
这是整个
sendMail
函数:
const functions = require("firebase-functions");
const admin = require("firebase-admin");
const cors = require("cors")({ origin: true });
const nodemailer = require("nodemailer");
admin.initializeApp();
// Use gmail to set up transporter
let transporter = nodemailer.createTransport({
service: "gmail",
auth: {
user: functions.config().mail.user,
pass: functions.config().mail.pass
},
});
exports.sendMail = functions
.region("us-central1")
.https.onCall((data, context) => {
const info = data.details;
const mailOptions = {
from: `${info.name} <${info.email}>`,
to: functions.config().mail.dest,
subject: info.subject,
html: `<p style="font-size: 16px;">${info.name}, ${info.email}</p>
<p
style="
font-size: 1rem;
background: #FFECB3;
padding: 10px;
border-radius: 10px;">${info.message}</p>
`, // email content in HTML
};
// returning results
return transporter.sendMail(mailOptions, (err, info) => {
if (err) {
console.log("failed", err);
}
});
});
我知道也有人问过类似的问题,但我确实尝试了几乎所有的方法。我仅在从我的 firebase 托管站点调用它时遇到 cors 问题。有人请帮忙!
onCall 函数的行为在 cors 方面与 onRequest 不同,例如,您需要确保从同一区域调用它。请参阅这篇文章
如果您的函数出错,则可能会出现 cors 问题,值得检查模拟器和您的发送邮件响应。