Nodemailer whit GMail SMTP OAuth2 autentication让我'无效状态代码401'

时间:2017-03-10 15:36:23

标签: node.js email oauth-2.0 google-oauth2 nodemailer

我正在尝试使用Nodemailer 3制作一个简单的邮件发件人,这是GMail API的OAuth2身份验证。

这是我的剧本:

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时,会发送电子邮件没有任何问题。但是,当我没有指定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 个答案:

答案 0 :(得分:0)

也许为时已晚,但只是在这里回答,有人遇到同样的问题。重置refreshToken时我的问题得到纠正。 This article为整个过程提供了很好的指导

答案 1 :(得分:0)

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