node.js - 如何在 Firebase 中免费发送电子邮件?
问题描述
我知道 Firebase 不允许您使用第 3 方电子邮件服务发送电子邮件。所以唯一的方法是通过Gmail发送。
所以我在互联网上搜索了一些方法,所以这是一个有效的片段,可以让我免费发送电子邮件。
export const shareSpeechWithEmail = functions.firestore
.document("/sharedSpeeches/{userId}")
.onCreate(async (snapshot, context) => {
// const userId = context.params.userId;
// const data = snapshot.data();
const mailTransport = nodemailer.createTransport(
`smtps://${process.env.USER_EMAIL}:${process.env.USER_PASSWORD}@smtp.gmail.com`
);
const mailOptions = {
to: "test@gmail.com",
subject: `Message test`,
html: `<p><b>test</b></p>`
};
try {
return mailTransport.sendMail(mailOptions);
} catch (err) {
console.log(err);
return Promise.reject(err);
}
});
我想创建一个模板,所以我使用了这个名为email-templates
nodemailer 的包。但该功能不会在 Firebase 控制台中执行,也不会显示错误并显示与“计费”相关的警告。
export const shareSpeechWithEmail = functions.firestore
.document("/sharedSpeeches/{userId}")
.onCreate(async (snapshot, context) => {
const email = new Email({
send: true,
preview: false,
views: {
root: path.resolve(__dirname, "../../src/emails")
// root: path.resolve(__dirname, "emails")
},
message: {
// from: "<noreply@domain.com>"
from: process.env.USER_EMAIL
},
transport: {
secure: false,
host: "smtp.gmail.com",
port: 465,
auth: {
user: process.env.USER_EMAIL,
pass: process.env.USER_PASSWORD
}
}
});
try {
return email.send({
template: "sharedSpeech",
message: {
to: "test@gmail.com",
subject: "message test"
},
locals: {
toUser: "testuser1",
fromUser: "testuser2",
title: "Speech 1",
body: "<p>test using email <b>templates</b></p>"
}
});
} catch (err) {
console.log(err);
return Promise.reject(err);
}
});
解决方案
只要您的项目在 Blaze 计划中,您绝对可以使用第三方服务和 Cloud Functions 发送电子邮件。官方提供的示例甚至建议“如果切换到 Sendgrid、Mailjet 或 Mailgun,请确保在 Firebase 项目上启用计费,因为这是向非 Google 服务发送请求所必需的。”
https://github.com/firebase/functions-samples/tree/master/quickstarts/email-users
无论您使用哪种电子邮件系统,这里的关键是您确实需要升级到 Blaze 计划才能建立传出连接。
推荐阅读
- .htaccess - htaccess - 如何将标题集添加到特定文件夹?
- python - ValueError:输入数组应具有与目标数组相同数量的样本。找到 32 个输入样本和 128 个目标样本
- c# - 绑定到 ViewModel 和 CodeBehind 一个可重用的 UserControl
- admin-on-rest - 编辑而不传递 id 作为标识符
- c# - FluentAssertions 检查对象字段不相等?
- gradle - gradle - 仅下载 maven 依赖项的任务
- arrays - 如何为任意嵌套长度的嵌套数组指定返回类型?
- python - 如何使用正确版本的python(OSX)?
- c++ - 看似随机的结果并不总是随机的
- javascript - 如何解决 [object Object] 警报?