如何在Firebase中免费发送电子邮件



我知道Firebase不允许您使用第三方电子邮件服务发送电子邮件。所以唯一的方法就是通过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);
}
});

我想创建一个模板,所以我为nodemailer使用了这个名为email-templates的包。但该函数不会在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计划中,您就可以使用第三方服务和云功能发送电子邮件。官方提供的样品甚至表明;如果切换到Sendgrid、Mailjet或Mailgun,请确保在Firebase项目上启用计费,因为这是向非谷歌服务发送请求所必需的">

https://github.com/firebase/functions-samples/tree/main/Node-1st-gen/quickstarts/email-users

这里的关键是,无论你使用哪种电子邮件系统,你都需要升级到Blaze计划才能建立传出连接。

您可以使用nodemailer:发送电子邮件

npm install nodemailer cors
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const nodemailer = require('nodemailer');
const cors = require('cors')({origin: true});
admin.initializeApp();
/**
* Here we're using Gmail to send 
*/
let transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'yourgmailaccount@gmail.com',
pass: 'yourgmailaccpassword'
}
});
exports.sendMail = functions.https.onRequest((req, res) => {
cors(req, res, () => {
// getting dest email by query string
const dest = req.query.dest;
const mailOptions = {
from: 'Your Account Name <yourgmailaccount@gmail.com>', // Something like: Jane Doe <janedoe@gmail.com>
to: dest,
subject: 'test', // email subject
html: `<p style="font-size: 16px;">test it!!</p>
<br />
` // email content in HTML
};
// returning result
return transporter.sendMail(mailOptions, (erro, info) => {
if(erro){
return res.send(erro.toString());
}
return res.send('Sended');
});
});    
});

另请参见此处

设置安全级别以避免出现错误消息:转到:https://www.google.com/settings/security/lesssecureapps将"访问不太安全的应用程序"设置设置为"启用">

参考

通过functions.https.onCall(..):直接调用sendMail()云函数

正如@Micha所提到的,不要忘记为发送的电子邮件启用不太安全的应用程序:https://www.google.com/settings/security/lesssecureapps

const functions = require('firebase-functions');
const nodemailer = require('nodemailer');
let mailTransport = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'supportabc@gmail.com',
pass: '11112222'
}
});
exports.sendMail = functions.https.onCall((data, context) => {
console.log('enter exports.sendMail, data: ' + JSON.stringify(data));
const recipientEmail = data['recipientEmail'];
console.log('recipientEmail: ' + recipientEmail);
const mailOptions = {
from: 'Abc Support <Abc_Support@gmail.com>',
to: recipientEmail,
html:
`<p style="font-size: 16px;">Thanks for signing up</p>
<p style="font-size: 12px;">Stay tuned for more updates soon</p>
<p style="font-size: 12px;">Best Regards,</p>
<p style="font-size: 12px;">-Support Team</p>
` // email content in HTML
};
mailOptions.subject = 'Welcome to Abc';
return mailTransport.sendMail(mailOptions).then(() => {
console.log('email sent to:', recipientEmail);
return new Promise(((resolve, reject) => {

return resolve({
result: 'email sent to: ' + recipientEmail
});
}));
});
});

也感谢:Micha的后

您可以使用Firebase扩展和Sendgrid:免费发送

https://medium.com/firebase-developers/firebase-extension-trigger-email-5802800bb9ea

弃用:https://www.google.com/settings/security/lesssecureapps

使用";使用应用程序密码登录":https://support.google.com/accounts/answer/185833?hl=en创建应用程序密码。

按照链接中的步骤操作,然后在mailTransport:中对用户使用给定的密码

const mailTransport = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'user@gmail.com',
pass: 'bunchofletterspassword'
}
});

最新更新