Firebase Cloud Functions 使用 Nodemailer 发送电子邮件

问题描述 投票:0回答:1

我目前在将 Firebase Cloud Functions 集成到 Nodemailer 时遇到问题,我目前正在使用 JavaScript 来做这件事,我的代码是:

const functions = require('firebase-functions');
const admin=require('firebase-admin');
const nodemailer = require('nodemailer');
admin.initializeApp();
require('dotenv').config()

var SUCCESS_CODE = 0;
const {SENDER_EMAIL, SENDER_PASSWORD} = process.env;

exports.sendEmail = functions.database.ref('Contestants/{contestantID}').onCreate((snap, context) =>{
    let contestantID = context.params.contestantID;
    let contestant = snap.val();
    
    let authData = nodemailer.createTransport({
        host:'smtp.gmail.com',
        port:465,
        secure:true,
        auth:{
            user:SENDER_EMAIL,
            pass:SENDER_PASSWORD
        }
    });

    authData.sendMail({
        from: SENDER_EMAIL,
        to:`${contestant.email}`,
        subject:`Subscription nº ${contestant.uid} - Concluded!`,
        text:`This is a test.`,
        html:`${htmlBody}`
    }).then(res=>SUCCESS_CODE=8888).catch(err=>SUCCESS_CODE=1313);

    return SUCCESS_CODE;
});

此功能将在用户完成我公司活动的网站计划订阅时使用。但是,在 firebase 控制台中,我收到消息

Function execution took 207 ms, finished with status: 'ok'
,但收件人从未收到电子邮件,也在电子邮件发件人 gmail 帐户上,没有显示已发送。

我有一个带有自定义域的自定义电子邮件,我的 Google G-Suite 帐户已经设置为接受安全性较低的应用程序,但它似乎不起作用。

P.S:我所有的项目都在 firebase 上,我的数据库在 Firebase Realtime Database 上,我的网站是用 Firebase Hosting 托管的。

我需要一些帮助来弄清楚我的代码有什么问题或者缺少什么来让它工作。另外,如果有人指导我如何在成功执行此功能后将数据发送到我的网站,我将不胜感激,例如,发送电子邮件后,在我的网站上打开一个新页面并显示成功消息。

我对我缺乏 JavaScript 知识表示歉意,这是我第一次尝试它,曾经使用 C# 和 Kotlin,但不得不为我的公司做一些云功能,这对我来说真的很新。

javascript firebase google-cloud-functions gmail nodemailer
1个回答
0
投票

你没有正确终止你的函数。您需要“通过返回 JavaScript promise 来解析执行异步处理的函数(也称为“后台函数”)”,如文档中所述。

所以下面的方法可以解决问题,因为

sendEmail()
方法返回一个 Promise 对象(如果未设置回调参数)。

exports.sendEmail = functions.database.ref('Contestants/{contestantID}').onCreate((snap, context) => {
    let contestantID = context.params.contestantID;
    let contestant = snap.val();

    let authData = nodemailer.createTransport({
        host: 'smtp.gmail.com',
        port: 465,
        secure: true,
        auth: {
            user: SENDER_EMAIL,
            pass: SENDER_PASSWORD
        }
    });

    return authData.sendMail({
        from: SENDER_EMAIL,
        to: `${contestant.email}`,
        subject: `Subscription nº ${contestant.uid} - Concluded!`,
        text: `This is a test.`,
        html: `${htmlBody}`
    });
});

我不确定你想用

then(res=>SUCCESS_CODE=8888).catch(err=>SUCCESS_CODE=1313);
做什么。什么是
res
?也许您混淆了 HTTPS Cloud Functions 和后台 Cloud Functions?

如果你想在 Cloud Functions 日志中记录一些东西,以防成功和错误,你可以这样做:

exports.sendEmail = functions.database.ref('Contestants/{contestantID}').onCreate((snap, context) => {

    let contestant = snap.val();

    let authData = nodemailer.createTransport(...);

    return authData.sendMail({
        from: SENDER_EMAIL,
        to: `${contestant.email}`,
        subject: `Subscription nº ${contestant.uid} - Concluded!`,
        text: `This is a test.`,
        html: `${htmlBody}`
    })
        .then(info => {
            console.log(info.messageId)  // For example, see the NodeMailer doc referred above
            return null; // Important, see CF doc
        })
        .catch(error => {
            console.log(error)
            return null; // Important
        })
});
© www.soinside.com 2019 - 2024. All rights reserved.