首页 > 解决方案 > 如何在 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-templatesnodemailer 的包。但该功能不会在 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);
    }
  });

标签: node.jsfirebasegoogle-cloud-functions

解决方案


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

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

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


推荐阅读