在 firebase 函数中使用 gmail 时出现 Nodemailer 错误

2024-02-04

我正在使用 firebase 云功能。我配置了以下设置。虽然这在我的本地计算机上运行得很好,但在服务器上运行时却给我带来了问题。我在互联网上尝试了无数的解决方法,但没有运气。这有什么问题吗?

'use strict'
const functions = require('firebase-functions');
var admin = require('firebase-admin');
const express = require('express');
const nodemailer = require('nodemailer');
const app = express()

var emailRecepient;
var userName;


const smtpTransport = nodemailer.createTransport({
service: "gmail",
host: 'smtp.gmail.com',
port: 587, // tried enabling and disabling these, but no luck
secure: false, // similar as above
auth: {
  user: '<emailid>',
  pass: '<password>'
    },
        tls: {
        rejectUnauthorized: false
    }
});

var mailOptions = {
  from: 'test <[email protected] /cdn-cgi/l/email-protection>',
  to: emailRecepient,
  subject: 'Welcome to test',
  text: 'welcome ' + userName + ". did you see the new things?"
};

function sendmail() {
smtpTransport.sendMail(mailOptions, function (error, info) {
    if (error) {
        console.log(error);
    }
    else {
        console.log('Email sent: ' + info.response);
    }
});
};

exports.sendEmails = functions.database.ref('/users/{userID}/credentials').onCreate((snap, context) => {

  const userID = context.params.userID;
  const vals = snap.val()

  userName = vals.name;
  emailRecepient = vals.email;

  smtpTransport.sendMail(mailOptions, function (error, info) {
  if (error) {
      console.log("Error sending email ---- ",error);
  }
  else {
      console.log('Email sent: ' + info.response);
  }
  });

  return true;

});

我在所有情况下遇到的错误是:

        Error sending email 2 ----  { Error: Invalid login: 534-5.7.14 <https://accounts.google.com/signin/continue?sarp=1&scc=1&plt=AKgnsbsi
    534-5.7.14 qRQLfD9YlFZDsPj7b8QQACro9c41PjhSVo0NZ4i5ZHNlyycFi_FyRp8VdZ_dH5ffWWAABQ
    534-5.7.14 8rH2VcXkyZBFu00-YHJUQNOqL-IqxEsZqbFCwCgk4-bo1ZeDaKTdkEPhwMeIM2geChH8av
    534-5.7.14 0suN293poXFBAk3TzqKMMI34zCvrZlDio-E6JVmTrxyQ-Vn9Ji26LaojCvdm9Bq_4anc4U
    534-5.7.14 SpQrTnR57GNvB0vRX1BihDqKuKiXBJ5bfozV1D1euQq18PZK2m> Please log in via
    534-5.7.14 your web browser and then try again.
    534-5.7.14  Learn more at
    534 5.7.14  https://support.google.com/mail/answer/78754 t2sm3669477iob.7 - gsmtp
        at SMTPConnection._formatError (/user_code/node_modules/nodemailer-smtp-transport/node_modules/smtp-connection/lib/smtp-connection.js:528:15)
        at SMTPConnection._actionAUTHComplete (/user_code/node_modules/nodemailer-smtp-transport/node_modules/smtp-connection/lib/smtp-connection.js:1231:30)
        at SMTPConnection.<anonymous> (/user_code/node_modules/nodemailer-smtp-transport/node_modules/smtp-connection/lib/smtp-connection.js:319:22)
        at SMTPConnection._processResponse (/user_code/node_modules/nodemailer-smtp-transport/node_modules/smtp-connection/lib/smtp-connection.js:669:16)
        at SMTPConnection._onData (/user_code/node_modules/nodemailer-smtp-transport/node_modules/smtp-connection/lib/smtp-connection.js:493:10)
        at emitOne (events.js:96:13)
        at TLSSocket.emit (events.js:188:7)
        at readableAddChunk (_stream_readable.js:176:18)
        at TLSSocket.Readable.push (_stream_readable.js:134:10)
        at TLSWrap.onread (net.js:559:20)
      code: 'EAUTH',
      response: '534-5.7.14 <https://accounts.google.com/signin/continue?sarp=1&scc=1&plt=AKgnsbsi\n534-5.7.14 qRQLfD9YlFZDsPj7b8QQACro9c41PjhSVo0NZ4i5ZHNlyycFi_FyRp8VdZ_dH5ffWWAABQ\n534-5.7.14 8rH2VcXkyZBFu00-YHJUQNOqL-IqxEsZqbFCwCgk4-bo1ZeDaKTdkEPhwMeIM2geChH8av\n534-5.7.14 0suN293poXFBAk3TzqKMMI34zCvrZlDio-E6JVmTrxyQ-Vn9Ji26LaojCvdm9Bq_4anc4U\n534-5.7.14 SpQrTnR57GNvB0vRX1BihDqKuKiXBJ5bfozV1D1euQq18PZK2m> Please log in via\n534-5.7.14 your web browser and then try again.\n534-5.7.14  Learn more at\n534 5.7.14  https://support.google.com/mail/answer/78754 t2sm3669477iob.7 - gsmtp',
      responseCode: 534,
      command: 'AUTH PLAIN' }

我什至已经关闭了allow secure apps in the google settings。但由于某种原因,这似乎不起作用。非常感谢任何帮助。

根据雷诺的建议,我尝试过firebase-samples/email-confirmation我遇到以下错误:

TypeError: snapshot.changed is not a function
at exports.sendEmailConfirmation.functions.database.ref.onWrite (/user_code/index.js:38:17)
at Object.<anonymous> (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:112:27)
at next (native)
at /user_code/node_modules/firebase-functions/lib/cloud-functions.js:28:71
at __awaiter (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:24:12)
at cloudFunction (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:82:36)
at /var/tmp/worker/worker.js:758:24
at process._tickDomainCallback (internal/process/next_tick.js:135:7)

Cheers


当您在后台触发的 Cloud Function 中执行异步操作时,您必须返回一个 Promise,这样 Cloud Function 就会等待该 Promise 解析才能终止。

Firebase 官方视频系列对此进行了很好的解释:https://firebase.google.com/docs/functions/video-series/ https://firebase.google.com/docs/functions/video-series/。特别是观看标题为“学习 JavaScript Promises”的三个视频(第 2 部分和第 3 部分特别关注后台触发的云函数,但之前的第 1 部分确实值得观看)。

所以你应该修改你的代码如下:

exports.sendEmails = functions.database.ref('/users/{userID}/credentials').onCreate((snap, context) => {

  const userID = context.params.userID;
  const vals = snap.val()

  userName = vals.name;
  emailRecepient = vals.email;

  return smtpTransport.sendMail(mailOptions);
});

如果您想将邮件发送的结果打印到控制台,可以这样做:

  return smtpTransport.sendMail(mailOptions)
    .then((info) => console.log('Email sent: ' + info.response))
    .catch((error) => console.log("Error sending email ---- ", error));
});

实际上有一个官方的 Cloud Functions 示例可以做到这一点,请参阅https://github.com/firebase/functions-samples/blob/master/email-confirmation/functions/index.js https://github.com/firebase/functions-samples/blob/master/email-confirmation/functions/index.js

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 firebase 函数中使用 gmail 时出现 Nodemailer 错误 的相关文章

  • Socket.io 与服务器离线连接

    如何检测服务器是否离线或由于其他原因无法连接 我的代码看起来像这样 this socket io connect connectionInfo reconnect false 它不会抛出任何错误 因此 try catch 子句不起作用 Us
  • 如何让 Firebase 与 Java 后端配合使用

    首先 如果这个问题过于抽象或不适合本网站 我想表示歉意 我真的不知道还能去哪里问 目前我已经在 iOS 和 Android 上开发了应用程序 他们将所有状态保存在 Firebase 中 因此所有内容都会立即保存到 Firebase 实时数据
  • node-mongodb-native的插入性能

    我正在使用 MongoDB 测试 Node js 的性能 我知道其中每一个都很好 彼此独立 但我正在尝试一些测试来感受它们 我遇到了这个问题 但无法确定来源 问题 我正在尝试在单个 Node js 程序中插入 1 000 000 条记录 它
  • Electron — 无法显示自定义图标

    我在以两种不同的方式设置 Electron 应用程序的图标时遇到问题 非打包 通过终端运行应用程序 我的 main js 确实指定了一个 图标 值 指向图标文件 但它不适用 包装 使用电子包装器 我的 package json 文件指定了
  • 错误:模块“html”不提供视图引擎(Express)

    我正在尝试设置一个简单的路由应用程序 但在渲染页面时不断遇到错误 Error Module html does not provide a view engine 奇怪的是我已经在 app js 文件中指定了视图引擎 但仍然收到错误 app
  • NodeJS:将 JSON 保存到 MongoDB

    我正在尝试从 API 获取 JSON 并将其存储到 MongoDB 数据库中 显然 这是行不通的 我的应用程序似乎停留在我尝试将数据保存到数据库的位置 请告知该怎么做 这是我的代码 var express require express v
  • 在 Firebase 中构建聊天应用的数据

    我正在关注 Firebase 指南结构化数据 https firebase google com docs database ios structure data flatten data structures对于聊天应用程序 他们建议的结
  • 如何在yarn中指定本地注册表?

    我有一个本地 Nexus 服务器 基本上我希望在上线之前先查看一下它prefer offline yarn install prefer offline cache folder C folder yarn cache preferred
  • 如何让我的云代码在我的 Worker dyno(而不是 Web dyno)上运行?

    我在heroku 上部署了一个解析服务器 我正在解析服务器上运行一些云代码 该代码需要几分钟才能运行 并且在 Web dyno 上运行时会导致 Heroku 出现超时错误 heroku router at error code H12 de
  • 获取telegram群组的所有用户

    我正在尝试获取电报组的所有用户 我看到方法 getChatAdministrators 但我认为 API 没有获取所有成员的方法 我正在使用nodejs的telegram bot api Telegram 机器人 API https cor
  • AJAX 发送数据到 Node.js 服务器

    我尝试使用 AJAX 将数据发送到 Node js 服务器 但不断遇到同样的问题 即接收问题 这是客户端 JavaScript AJAX 代码 var objects function return new XMLHttpRequest f
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • Node.js - 生成的进程正在生成错误“execvp():没有这样的文件或目录”

    我有以下代码 旨在生成并分离子进程 它只是同一目录中的另一个 node js 脚本 这是我正在运行的确切代码 var fs require fs var child require child process var out fs open
  • 以异步方式执行 Express res.render

    我有一个 Nodejs 应用程序 其中res renderExpress 方法以阻塞方式花费大约 400 毫秒 我如何处理它以非阻塞方式执行 我的 apache 基准测试需要 12 秒来执行大约 30 个并发请求 我如何以更好的方式实施这一
  • 使用 Nodemailer 提交电子邮件时 NodeJs 错误

    我已按照以下步骤设置 Nodemailer 1 允许访问 Gmail 中安全性较低的应用程序 2 在app js中写入以下内容 app post reachus send function req res var transporter n
  • 使用 ObjectId 键和字符串数组定义映射作为 mongoose 模式中的值

    我在为数据库创建 Mongoose 架构时遇到问题 我想创建一个以 objectId 作为键 以字符串值数组作为值的映射 我能得到的最接近的是 var schema new Schema map myId type mongoose Sch
  • 限制 Axios 请求

    我正在使用 axios 向 Deezer API 发出请求 不幸的是 使用 Deezer 的 API 当您请求艺术家的专辑时 它不包括专辑曲目 因此 我正在通过请求艺术家的专辑 然后对每个专辑执行后续的 axios 请求来解决这个问题 我遇
  • 使用无服务器访问 SSM 变量

    我想用无服务器变量中的 SSM 参数 https serverless com blog serverless v1 22 0 按照文档 我运行了以下命令 aws ssm put parameter name foo value bar t
  • Dialogflow Fulfillment Webhook 调用失败

    I am new to dialogflow fulfillment and I am trying to retrieve news from news API based on user questions I followed doc
  • Node 不断恢复到旧版本

    每次我在控制台中重新启动 vagrant 时 它都会询问我的登录详细信息 然后说Now using node v7 10 0 npm v4 2 0 当我做run nvm install node I get v13 11 0 is alre

随机推荐

  • Python错误:NameError:名称未定义[重复]

    这个问题在这里已经有答案了 import numpy as np from scipy import optimize as opt import time def grad d weight 0 0 learnrate 0 01 tol
  • 未启用延迟段创建功能 (ORA-00439)

    I have sql包含 60 多个表的 DDL 的脚本文件 我正在尝试将脚本复制粘贴到 SQL Developer 中 连接到数据库 Oracle Database 11g Express Edition Release 11 2 0 2
  • zurb 基金会中心网格中的内容

    我试图将图像水平居中到 zurb 列中 但这似乎不可能 我尝试了一切 到处搜索 但我无法让它工作 这是我的代码 div class row div class twelve columns br img src img 06 jpeg al
  • 如何删除 Rabbitmq 以便我可以重新安装

    我遇到了麻烦 所以我进入注册表并删除了rabbitmq的服务条目 现在 当我尝试重新安装时 它说它已经存在 但无法启动 因为我删除了它 我可以执行以下操作sc delete rabbitmq 如何完全删除它的所有痕迹并从头开始重新安装 我猜
  • 我想扩展 std::string,但不是出于您可能认为的原因

    我有一个有效地接受字符串的方法 但是 我想要使用的字符串子集非常有限 我正在考虑将 std string 作为某个类进行 typedef ing 并显式调用函数 不过 我不确定这是否有效 有想法吗 通常的规则仍然适用 该类不是设计为继承的
  • 检查 iOS 应用程序上的互联网连接,Cordova Phonegap 3.3.0 无法正常工作

    我尝试过以下this http cordova apache org docs en 3 3 0 cordova connection connection md html The 20Command Line 0AInterfaceCor
  • ASP.Net MVC 基于安全性隐藏/显示菜单项

    我正在开发一个 ASP Net MVC 3 网站 Layout 主视图包含一个菜单 我想根据您是否登录以及您所处的角色隐藏菜单中的一些项目 目前使用这样的代码可以工作 if HttpContext Current User Identity
  • MySQL默认值错误与ON DUPLICATE KEY UPDATE

    为什么我会收到此错误 MySQL 版本是否发生了某些变化 导致此操作 曾一度有效 现在失败 INSERT INTO 未指定 user id 值would如果插入已完成 则需要 但由于 id 1 已经存在 因此这应该成为更新并且有效 mysq
  • MassTransit - 等待所有活动完成然后继续处理

    如果我有很多活动 是否会导致资源阻塞或请求超时 这是我的场景 我有一个 api 控制器 它向消费者发送订单请求 我使用请求 响应模式来接收错误信息来自消费者的属性并基于该属性响应返回 如果它为空我想返回OK 否则 返回BadRequest
  • 为 MySql 中的视图生成唯一的长 ID

    我可以看到三张桌子 它有 6 列 如下所示 ID NAME PRINCIPAL ID DESCRIPTION GROUP ID TYPE 正如我正在使用的hibernate要从数据库检索数据 我必须将ID此视图中的列 问题是 我无法生成唯一
  • 有没有办法通过联合访问各个位?

    我正在写一个C程序 我想要一个可以作为字符访问的变量 但我也可以访问其特定位 我想我可以使用这样的工会 typedef union unsigned char status bit bits 8 DeviceStatus 但编译器不喜欢这样
  • Android 警报对话框中可以有垂直按钮吗?

    默认情况下 我们会在警报对话框中看到两个或三个水平对齐的按钮 是否可以让它们在警报对话框中垂直对齐 当然 你可以使用Dialog setContentView 将对话框的内容设置为任意布局 Dialog dialog new Dialog
  • 如何显示Windows 7风格的上下文菜单?

    在我的 NET 应用程序中 上下文菜单与左侧类似 我怎样才能将 Windows 7 风格应用到它们上 使它们看起来像正确的样式 右键单击工具箱 选择项目 勾选 ContextMenu 命名空间 System Windows Forms 且目
  • 改变布局的 Javascript/jQuery focusout 事件导致 click 事件不触发

    我有一个字段 当您将焦点放在它上时 它会更改页面的布局 我的页面上还有提交表单的按钮 如果我进入字段并输入一个值 然后单击按钮 则按钮单击事件永远不会触发 这似乎是因为布局正在改变而发生的before单击事件被触发 这意味着按钮改变了位置
  • MSVC-10 包含路径

    如何指定 MSVC 搜索包含文件的位置 我想将增强标头添加到搜索路径中 我没有使用 Visual Studio 项目 只是使用编译器 您需要将它们编辑到 INCLUDE 环境变量中 您可以通过系统属性属性页找到它 例如 仅限 Windows
  • perlbrew 失败并显示“无法找到 Devel/PatchPerl.pm”

    perlbrew失败了Can t locate Devel PatchPerl pm 更准确地说 失败的是运行patchperl这是由产生的perlbrew There is事实上Devel PatchPerl pm通过环境变量中的路径访问
  • 如何在Android Studio中从默认的ConstraintLayout切换到RelativeLayout

    我有最新的 android Studio 2 3 beta 3 似乎 ConstraintLayout 是创建项目时的默认设置 如何让 Android Studio 使用relativelayout作为新项目的默认布局元素 嗯 我看到了上面
  • ActiveMQ 中的只读 Web 控制台访问

    我正在使用 ActiveMQ 5 10 并且想创建一个通过 Web 控制台具有只读访问权限的用户 红帽发布本文 https access redhat com solutions 389323 提到由于 ActiveMQ 中的错误 它并不是
  • 如何使用彩色置信区间带绘制回归原始比例的回归图?

    我想从线性模型中绘制线条和 95 置信区间 其中响应已按数据的原始比例进行 Logit 转换 因此 结果应该是一条曲线 包括原始尺度上的置信区间 而在 Logit 变换尺度上它将是一条直线 参见代码 Data dat lt data fra
  • 在 firebase 函数中使用 gmail 时出现 Nodemailer 错误

    我正在使用 firebase 云功能 我配置了以下设置 虽然这在我的本地计算机上运行得很好 但在服务器上运行时却给我带来了问题 我在互联网上尝试了无数的解决方法 但没有运气 这有什么问题吗 use strict const function