首页 > 解决方案 > 无法使用 Firebase 云功能发送电子邮件

问题描述

创建 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 函数日志

*sendEmail 结算帐户未配置。外部网络无法访问,配额受到严格限制。配置结算帐户以删除这些限制

sendEmail 函数返回未定义、预期的 Promise 或值*

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

任何帮助将非常感激。

标签: javascriptfirebasegoogle-cloud-firestorenodemailer

解决方案


错误消息告诉您,您的代码根据要求返回了承诺或值以外的内容。问题是你使用的方式transporter.sendMail()。根据nodemailer 文档,如果你传递回调方法(你正在sendMail做的)只会返回一个承诺,否则它会返回 undefined。所以你的函数返回未定义。

您应该做的是删除回调参数,而是处理返回的承诺的结果。您还可以从函数返回承诺。

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

推荐阅读