当前位置: 首页 > 知识库问答 >
问题:

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

张鹏鹍
2023-03-14

我知道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-模板的包。但是该函数不会在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);
    }
  });

共有3个答案

桑璞
2023-03-14

直接通过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的帖子

韦高谊
2023-03-14

您可以使用 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将访问不太安全的应用程序设置为启用

请参阅

鲜于德泽
2023-03-14

只要您的项目在Blaze计划中,您绝对可以使用第三方服务和Cloud Functions发送电子邮件。官方提供的示例甚至建议“如果切换到Sendgrid、Mailjet或Mailgun,请确保您在Firebase项目上启用计费,因为这是向非Google服务发送请求所必需的。”

https://github.com/firebase/functions-samples/tree/master/quickstarts/email-users

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

 类似资料:
  • 问题内容: 我最近开始编程我的第一个node.js。但是,我发现我无法创建直接发送到我的电子邮件的“联系我”表单,因为我无法从能够发送电子邮件的节点中找到任何模块。 有人知道node.js电子邮件库或示例联系表单脚本吗? 问题答案: node-email-templates是一个更好的选择:https : //github.com/niftylettuce/node-email- template

  • 可能重复: 如何从我的Android应用程序发送电子邮件? 我正在创建一个main。xml 如何在android中发送电子邮件。但必须是固定id(例如:myid@example.com) 我有main。xml

  • 问题内容: 我已经使用JMS在Web应用程序中成功发送了电子邮件,但是结果仅以纯文本显示。我希望内容能够显示html。我该怎么做?这大致就是我所拥有的: 问题答案: 根据Javadoc,在需要时,这些设置将默认的mime类型设置为。而是使用代替。

  • 问题内容: 我希望我的网站能够发送电子邮件而不刷新页面。所以我想使用Javascript。 这是我要调用的函数的方式,但是我不确定要在javascript函数中放入什么。通过研究,我发现了一个使用mailto方法的示例,但是我的理解是实际上并没有直接从站点发送邮件。 所以我的问题是,我在哪里可以找到要放在JavaScript函数中的内容,以便直接从网站发送电子邮件。 问题答案: 您不能直接使用ja

  • 问题内容: 我在理解如何使用Python通过电子邮件发送附件时遇到问题。我已成功通过电子邮件将简单消息通过电子邮件发送。有人可以在电子邮件中说明如何发送附件。我知道在线上还有其他帖子,但是作为Python初学者,我很难理解它们。 问题答案: 这是另一个: