You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue调用Firebase云函数发送邮件时触发HttpsErrorImpl内部错误

调用Firebase云函数发送邮件时出现HttpsErrorImpl内部错误

开发应用时,从联系表单收集数据后调用Firebase云函数发送邮件,触发了未知的HttpsErrorImpl内部错误。已尝试更换多个Firebase版本、搜索解决方案但问题仍未解决。

代码片段

Form.vue组件代码

export default {
data(){
        return{
            typPozemku: "",
            firstName: "",
            lastName: "",
            email: "",
            zprava: "",
        }
    },
methods: {
    submitForm(){
        const data = {
        typPozemku: this.typPozemku,
        firstName: this.firstName,
        lastName: this.lastName,
        email: this.email,
        zprava: this.zprava,
        timestamp: new Date().getTime()
        };

        const sendEmail = firebase.functions().httpsCallable('sendEmail');
        sendEmail(data)
          .then(response => {
            console.log(response.data);
          })
          .catch(error => {
            console.error(error);
            // 此处触发错误
          });

        const db = firebase.database().ref('contacts');
        db.push(data)
          .then(() => {
            console.log('Data added to Firebase');
          })
          .catch(error => {
            console.error(error);
          });
      }
    }
}

Firebase云函数代码

const functions = require("firebase-functions");
const admin = require("firebase-admin");
const nodemailer = require('nodemailer');
const cors = require('cors')({origin: true});


const transporter = nodemailer.createTransport({
  host: 'smtp.gmail.com',
  port: 465,
  secure: true,
  auth: {
    user: 'myemail',
    pass: 'mypassowrd'
  }
});

exports.sendEmail = functions.https.onRequest((request, response) => {
  cors(request, response, () => {
    

  const typPozemku = data.typPozemku;
  const firstName = data.firstName;
  const lastName = data.lastName;
  const email = data.email;
  const message = data.message;

  const mailOptions = {
    from: 'myemail',
    to: 'theiremail',
    subject: 'Nová zpráva!',
    text: `Jméno: ${firstName}\nPříjmení: ${lastName}\nTyp pozemku: ${typPozemku}\nEmail: ${email}\nZpráva: ${message}`
  };
  

  transporter.sendMail(mailOptions, (error, info) => {
    if (error) {
      console.log(error);
      res.status(500).send('Error sending email');
    } else {
      console.log('Email sent: ' + info.response);
      res.set('Access-Control-Allow-Origin', 'https://remax-4f73b.web.app/');
      res.set('Access-Control-Allow-Methods', 'GET, POST');
      res.set('Access-Control-Allow-Headers', 'Content-Type');
      res.status(200).send('Email sent successfully!');
    }
  });
  
  });
});

问题排查与修复

1. 云函数类型不兼容

前端用firebase.functions().httpsCallable('sendEmail')调用,但后端定义的是functions.https.onRequest类型的HTTP触发器——这两种调用方式不匹配:

  • httpsCallable对应后端的functions.https.onCall类型,自动处理请求序列化、认证等逻辑
  • onRequest是普通HTTP接口,需要用fetch/axios直接请求函数URL

修复:将后端改为onCall类型(推荐),或前端改用普通HTTP请求调用onRequest接口。

2. 云函数变量错误

  • 未从请求中获取data:onRequest中需用const data = request.body;,onCall则直接接收data参数
  • 前端传递的字段是zprava,后端却取data.message,字段不匹配
  • 回调中使用res,但参数是response,变量名写错

3. Gmail SMTP配置问题

使用Gmail时,若开启2FA需用App密码登录;未开启2FA则需暂时开启“低安全性应用访问”(不推荐,建议用App密码)。

修复后的云函数代码(onCall版本)

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

const transporter = nodemailer.createTransport({
  host: 'smtp.gmail.com',
  port: 465,
  secure: true,
  auth: {
    user: '你的邮箱地址',
    pass: '你的App密码或授权码'
  }
});

exports.sendEmail = functions.https.onCall(async (data, context) => {
  try {
    const typPozemku = data.typPozemku;
    const firstName = data.firstName;
    const lastName = data.lastName;
    const email = data.email;
    const message = data.zprava; // 匹配前端的zprava字段

    const mailOptions = {
      from: '你的邮箱地址',
      to: '目标收件邮箱',
      subject: 'Nová zpráva!',
      text: `Jméno: ${firstName}\nPříjmení: ${lastName}\nTyp pozemku: ${typPozemku}\nEmail: ${email}\nZpráva: ${message}`
    };

    await transporter.sendMail(mailOptions);
    return { message: 'Email sent successfully!' };
  } catch (error) {
    console.error(error);
    throw new functions.https.HttpsError('internal', '发送邮件失败', error.message);
  }
});

额外建议

  • 部署云函数后,去Firebase控制台查看云函数日志,能获取更详细的错误信息
  • 确保云函数权限允许匿名访问(若不需要用户认证)
  • 验证前端Firebase初始化配置正确,与云函数部署的项目一致

内容的提问来源于stack exchange,提问作者thomas patolan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 23:42:45