当前位置: 首页 > 知识库问答 >
问题:

带有GMail SMTP OAuth2身份验证的节点邮件程序向我发送'无效状态代码401 '

於鸿羲
2023-03-14

我正在尝试使用NodeEmailer 3创建一个简单的邮件发送者,这是一个带有OAuth2身份验证的GMail API。

这是我的剧本:

var serverConfig  = {
  gmail: {
      client_user : 'my@email.com',
      client_id : '349...myClientId',
      secret : 'mysecret..123jd123',
      refresh_token : 'x/xxxxxxxxxxxxxx-reZuEMeSuJaSERmCVY',
      access_token : 'xxxxxxxxxxxxxxxxx',
      expires: '3599'
  }
}

// 3LO authentication https://nodemailer.com/smtp/oauth2/#example-3
var transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    type: 'OAuth2',
    user: serverConfig.gmail.client_user,
    clientId: serverConfig.gmail.client_id,
    clientSecret: serverConfig.gmail.secret,
    refreshToken: serverConfig.gmail.refresh_token
  },
});

module.exports = {
    "send": function(_from,_to,_subject,_html,_text){
      // setup email data with unicode symbols
      var mailOptions = {
          from: _from,
          to: _to, // list of receivers
          subject: _subject, // Subject line
          html: _html, // html body
          text: _text // plain text body
      };

      transporter.sendMail(mailOptions, function(error, info){
          if (error) {
              return console.log(error);
          }
          console.log('Message ' + info.messageId + ' sent: %s' + info.response);
      })
  }


}

当我在auth对象中强制使用access_token时,电子邮件发送没有任何问题。但是,当我没有指定< code>access_token,只指定了de refresh_token时,我得到了以下错误:

{ Error: Invalid status code 401
    at ClientRequest.req.on.res (/myproject/node_modules/nodemailer/lib/fetch/index.js:193:23)
    at emitOne (events.js:96:13)
    at ClientRequest.emit (events.js:188:7)
    at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:474:21)
    at HTTPParser.parserOnHeadersComplete (_http_common.js:99:23)
    at TLSSocket.socketOnData (_http_client.js:363:20)
    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)
  type: 'FETCH',
  sourceUrl: 'https://accounts.google.com/o/oauth2/token',
  code: 'EAUTH',
  command: 'AUTH XOAUTH2' }

共有2个答案

南门正祥
2023-03-14

我能够通过转到 https://console.cloud.google.com/apis/credentials,选择正确的OAuth 2.0客户端ID,然后选择顶部的“重置机密”来解决此问题。这撤销了我的旧密钥并生成了一个新密钥,然后我在OAuth Playground中使用该密钥来交换刷新令牌。我将新的客户端密码和刷新令牌放在 nodemailer 的身份验证对象中,它又开始工作了。

邵星河
2023-03-14

也许太晚了,但如果有人遇到同样的问题,请在这里回答。当刷新令牌重置时,我的问题得到了纠正。这篇文章为整个过程提供了很好的指导

 类似资料:
  • SMTP服务器 ;                  [myserverName] 默认用户电子邮件后缀 ; [myemailId] 使用SMTP身份验证 ; true 用户名称 ;                     [myemailId] 密码 ;                       [mypassword] 使用SSL ;                       假 SMTP

  • 当我尝试使用PHP SMTP电子邮件服务器发送电子邮件时,发生了以下错误。 邮件程序错误:SMTP错误:无法进行身份验证。 下面是我使用的代码。 } 如何修复此错误。

  • 如何使用firebase中的验证电子邮件验证使用电子邮件和密码登录的用户?这背后的逻辑是如何工作的,它在代码中会是什么样子? 解决方案/帮助:对于那些仍在寻找答案的人,我找到了这篇文章 堆栈溢出 帖子

  • 问题内容: 我想做一个可以将电子邮件发送到任何指定的收件人(gmail)的功能。我面临的问题是,当我尝试提供在gmail中使用双向身份验证的凭据时,身份验证失败。使用没有双向身份验证的帐户,它可以正常工作。那么我必须做些什么才能使启用双向身份验证的事情发生? 以下是我用来发送电子邮件的代码。 问题答案: 通过在https://accounts.google.com/IssuedAuthSubTok

  • 我正在构建一个API,并试图在多个上下文中解决身份验证问题。 API需要为我们创建和部署的客户端应用程序提供服务,并使用密码处理经过身份验证的请求。在每个请求中都发送密码并不是一个好主意,因此首先点击登录endpoint并获得会话ID更有意义。问题中的webapp是用AngularJS编写的,应该在localStorage中跟踪自己的会话,以减轻会话劫持并消除对cookie的依赖以跟踪会话。 we

  • 我试图理解为什么JWT认证是无状态的。在有状态认证中,会有一个会话id。这里有一张JWT的代币,上面有签名。所以身份验证服务器发布JWT令牌,但是我可以说后续请求中JWT令牌的验证是由endpoint服务器(应用服务器)而不是身份验证服务器来完成的吗?我相信这是可能的,因为JWT是用截止日期(还有一些其他信息)签名的,并且认证服务器的公共证书对所有endpoint服务器都是可用的。 因此,认证服务