Node.js 如何在Firebase中免费发送电子邮件?

Node.js 如何在Firebase中免费发送电子邮件?,node.js,firebase,google-cloud-functions,Node.js,Firebase,Google Cloud Functions,我知道Firebase不允许您使用第三方电子邮件服务发送电子邮件。所以唯一的办法就是通过Gmail发送 所以我在互联网上搜索了一些方法,这里有一个片段可以让我免费发送电子邮件 export const shareSpeechWithEmail = functions.firestore .document("/sharedSpeeches/{userId}") .onCreate(async (snapshot, context) => { // const userId

我知道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);
    }
  });


只要您的项目在Blaze计划中,您就可以使用第三方服务和云功能发送电子邮件。该官员提供的样本甚至建议,“如果切换到Sendgrid、Mailjet或Mailgun,请确保您在Firebase项目上启用计费,因为这是向非谷歌服务发送请求所必需的。”


无论您使用的是哪种电子邮件系统,这里的关键是您确实需要升级到Blaze plan以建立传出连接。

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

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');
        });
    });    
});
npm安装nodemailer cors
const functions=require('firebase-functions');
const admin=require('firebase-admin');
const nodemailer=require('nodemailer');
const cors=require('cors')({origin:true});
admin.initializeApp();
/**
*我们用Gmail发送邮件
*/
让transporter=nodeEmailer.createTransport({
服务:“gmail”,
认证:{
用户:'yourgmailaccount@gmail.com',
传球:“Yourgmailcpassword”
}
});
exports.sendMail=functions.https.onRequest((req,res)=>{
cors(请求、回复等){
//通过查询字符串获取dest电子邮件
const dest=req.query.dest;
常量邮件选项={
from:'您的帐户名',//类似于:Jane Doe
致:dest,
主题:'测试',//电子邮件主题
html:`

测试它


`//HTML格式的电子邮件内容 }; //返回结果 return transporter.sendMail(邮件选项,(错误,信息)=>{ 如果(错误){ 返回res.send(erro.toString()); } 返回res.send('Sended'); }); }); });
另见

设置安全级别以避免错误消息: 去: 将不太安全的应用的访问设置设置为启用

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

正如@Micha提到的,不要忘记为发送的电子邮件启用不太安全的应用程序:

const functions=require('firebase-functions');
const nodemailer=require('nodemailer');
让mailTransport=nodeEmailer.createTransport({
服务:“gmail”,
认证:{
用户:'supportabc@gmail.com',
通行证:'11112222'
}
});
exports.sendMail=functions.https.onCall((数据、上下文)=>{
log('enter exports.sendMail,data:'+JSON.stringify(data));
const recipientEmail=数据['recipientEmail'];
console.log('recipientEmail:'+recipientEmail);
常量邮件选项={

from:'Abc Support

假设我启用了blaze plan并使用sendgrid发送电子邮件。即使我在他们的免费计划中没有达到配额,也会花费一些费用吗?如果您有账单问题,请咨询。如果没有足够的信息,请联系Firebase支持部门以获取账单问题。谢谢,我将尝试此解决方案。我可以只使用nodemailer发送电子邮件,但当我使用使用nodemailer的电子邮件模板包时,它不起作用,我想知道这是为什么?这似乎是一个安全问题。如上所述。是的,我已经打开了安全性较低的应用程序。但仍然存在相同的错误错误错误:无效登录:534-5.7.14 534-5.7.14发生此错误:(我被授权访问不太安全的应用程序(在Gmail中),但仍然被阻止访问。这是使用应用程序密码。无需打开访问不太安全的应用程序。(转到帐户设置,创建应用程序密码,并将该密码作为电子邮件密码)
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');
        });
    });    
});
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
            });
        }));
    });
});