无法使用 firebase 云功能发送电子邮件

Unable to sendEmail using firebase cloud function

创建 Firestore 文档后无法发送电子邮件。创建 firestore 上的文档后,我正在尝试向 webapp 管理员的电子邮件发送通知电子邮件。但是面临以下问题。

index.js

const functions = require('firebase-functions');
const admin = require("firebase-admin")
const nodemailer = require('nodemailer');

admin.initializeApp()


//google account credentials used to send email
var transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 465,
    secure: true,
    auth: {
        user: '*****@gmail.com',
        pass: '******'
    }
});


exports.sendEmail = functions.firestore
    .document('stories/{sId}')
    .onCreate((snap, context) => {

        const mailOptions = {
            from: `*******@gmail.com`,
            to: snap.data().email,
            subject: 'contact form message',
            html: `<h1>Order Confirmation</h1>
                                <p>
                                   <b>Email: </b>${snap.data().email}<br>
                                </p>`
        };


        return transporter.sendMail(mailOptions, (error, data) => {
            if (error) {
                return res.send(error.toString());
            }
            var data = JSON.stringify(data)
            return res.send(`Sent! ${data}`);
        });
    
    });    

Firebase 函数日志

*发送邮件 未配置结算帐号。外部网络无法访问且配额受到严格限制。配置结算帐户以移除这些限制

发送邮件 函数返回未定义、预期的 Promise 或值*

我假设忽略日志中的计费消息是安全的,因为计费计划不是强制性的?

如有任何帮助,我们将不胜感激。

错误消息告诉您,您的代码 return 编辑了一些不同于所需的承诺或值的内容。问题在于您使用 transporter.sendMail() 的方式。根据 nodemailer documentationsendMail 只会 return 如果您 传递回调方法(您 正在做)否则它 return 未定义。所以你的函数是 returning undefined.

您应该做的是删除回调参数并处理 returned promise 的结果。您还可以 return 函数中的承诺。

    return transporter.sendMail(mailOptions)
    .then(data => {
        // decide what you want to do on success
    })
    .catch(err => {
        // decide what you want to do on failure
    });