我正在使用带有nodemailer的Firebase功能从我网站上的联系表单发送电子邮件。
我正处于免费计划中,据我所知,Gmail API被认为是Google服务而不是一般的互联网请求,因此它应该可以正常使用。
这是我的Typescript代码
import * as functions from 'firebase-functions';
import * as nodemailer from 'nodemailer';
import { DocumentSnapshot } from 'firebase-functions/lib/providers/firestore';
export const sendMessage = functions.firestore.document('/emails/{pushKey}').onCreate((snap: DocumentSnapshot) => {
const form = snap.data();
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
type: 'OAuth2',
user: 'myemail@gmail.com',
clientId: 'xxxxxxxxxxxxx',
clientSecret: 'xxxxxxxxx',
refreshToken: 'xxxxxxxxx'
},
debug: true
});
const mailOptions = {
from: 'sender@gmail.com',
to: 'receiver@gmail.com',
subject: `Message from ${form.name} <${form.email}>`,
html: form.message
};
return transporter.sendMail(mailOptions)
.then(() => {
console.log('Email sent.');
}).catch((err) => {
console.log(err);
});
});
但是,我进入了控制台日志
sendMessage 功能执行耗时2908毫秒,状态结束:'ok'
sendMessage 函数返回未定义,预期的承诺或值
sendMessage 未配置结算帐户。外部网络无法访问,配额严重受限。配置结算帐户以删除这些限制
sendMessage 功能执行已开始
我在这里使用任何外部网络了吗?
以下代码适用
import * as functions from 'firebase-functions';
import * as nodemailer from 'nodemailer';
import { DocumentSnapshot } from 'firebase-functions/lib/providers/firestore';
const gmailEmail = encodeURIComponent(functions.config().gmail.email);
const gmailPassword = encodeURIComponent(functions.config().gmail.password);
const mailTransport = nodemailer.createTransport(`smtps://${gmailEmail}:${gmailPassword}@smtp.gmail.com`);
export const sendMessage = functions.firestore.document('/emails/{pushKey}').onCreate((snap: DocumentSnapshot) => {
const form = snap.data();
const mailOptions = {
to: 'receiver@gmail.com',
subject: `Message from ${form.name} <${form.email}>`,
html: form.message
};
return mailTransport.sendMail(mailOptions)
.then(() => console.log('worked!'))
.catch(e => console.log(e));
});
但这种方式是不安全的,它要求我允许在我的Gmail帐户上安全性较低的应用。
如何将Gmail和OAuth2与免费的Firebase计划一起使用?
答案 0 :(得分:-2)
因此,您无法在Firebase免费计划上发出出站请求。您需要升级您的计划以进行出站请求,我相信,因为您使用的是“nodemailer”,它是尝试发出出站请求的部分。以下是关于升级使用邮件服务的评论的另一个问题:How can I use nodemailer with Cloud Functions for Firebase?
我相信Firebase也会让Blaze计划免费,直到您超过免费计划的配额,所以在您超过定价(https://firebase.google.com/pricing/)中指定的免费配额之前,它确实不会花费任何费用。