代码之家  ›  专栏  ›  技术社区  ›  Aakash Dave

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

  •  0
  • Aakash Dave  · 技术社区  · 6 年前

    我正在使用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 <hello@example.com>',
      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)
    

    干杯

    1 回复  |  直到 6 年前
        1
  •  2
  •   Renaud Tarnec    6 年前

    当您在后台触发的云函数中执行异步操作时,必须返回一个承诺,以这种方式,云函数将等待该承诺解析以终止。

    这在Firebase官方视频系列中得到了很好的解释: https://firebase.google.com/docs/functions/video-series/ . 特别是看三个名为“学习JavaScript承诺”的视频(第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));
    });
    

    实际上,有一个官方的云函数示例正是这样做的,请参见 https://github.com/firebase/functions-samples/blob/master/email-confirmation/functions/index.js

        2
  •  0
  •   Daniel Danielecki    6 年前

    1)

    import * as admin from 'firebase-admin';
    import * as functions from 'firebase-functions';
    import * as nodemailer from 'nodemailer';
    
    admin.initializeApp();
    
    // I'm taking all these constants as secrets injected dynamically (important when you make `git push`), but you can simply make it as a plaintext.
    declare const MAIL_ACCOUNT: string; // Declare mail account secret.
    declare const MAIL_HOST: string; // Declare mail account secret.
    declare const MAIL_PASSWORD: string; // Declare mail password secret.
    declare const MAIL_PORT: number; // Declare mail password secret.
    
    const mailTransport = nodemailer.createTransport({
      host: MAIL_HOST,
      port: MAIL_PORT, // This must be a number, important! Don't make this as a string!!
      auth: {
        user: MAIL_ACCOUNT,
        pass: MAIL_PASSWORD
      }
    });
    
    exports.sendMail = functions.https.onRequest(() => {
      const mailOptions = {
        from: 'ME <SENDER@gmail.com>',
        to: 'RECEIVER@gmail.com',
        subject: `Information Request from ME`,
        html: '<h1>Test</h1>'
      };
      mailTransport
        .sendMail(mailOptions)
        .then(() => {
          return console.log('Mail sent'); // This log will be shown in Firebase Firebase Cloud Functions logs.
        })
        .catch(error => {
          return console.log('Error: ', error); // This error will be shown in Firebase Cloud Functions logs.
        });
    });
    

    这就是说,您应该收到来自的电子邮件 SENDER@gmail.com RECEIVER@gmail.com

    注意:我在网上正确发送邮件时遇到了同样的问题 localhost port host 在里面 createTransport

    const mailTransport = nodemailer.createTransport({
      service: 'gmail',
      auth: {
        user: MAIL_ACCOUNT,
        pass: MAIL_PASSWORD
      }
    });
    

    除此之外,不要忘记启用 Less secure app access 在…上 . 阿尔索 https://accounts.google.com/DisplayUnlockCaptcha

        3
  •  0
  •   consugus    5 年前

    在检查了上面列出的所有事情都是在我的代码中完成的之后,我解决了在Google帐户中登录的问题(我在proyect中使用的帐户)。我必须从另一个来源(谷歌检测到Firebase试图访问该帐户)识别该活动,就是这样。

    推荐文章