Firebase云功能使用Nodemailer发送电子邮件

xcitsw88  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(120)

我目前在将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实时数据库上,我的网站是用Firebase托管的。
我需要一些帮助来弄清楚我的代码有什么问题或者缺少什么来使它工作。此外,如果有人给予我一个方向,如何发送数据到我的网站时,此功能执行成功,一个例子是,发送电子邮件后,打开一个新的页面在我的网站上的成功消息。
我很抱歉我对JavaScript缺乏了解,这是我第一次尝试它,曾经使用C#和Kotlin,但不得不为我的公司做一些云功能,这对我来说真的很新。

q3qa4bjr

q3qa4bjr1#

你没有正确地终止你的函数。您需要“通过返回JavaScript promise来解析执行异步处理的函数(也称为“后台函数”)”,如documentation.
因此下面的代码就可以做到这一点,因为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日志中记录成功和错误的情况,您可以执行以下操作:

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
        })
});

相关问题