我已将Nodemailer设置为使用OAuth2与Gmail配合使用。它一直正常工作,直到访问令牌到期。此时,尽管有刷新令牌,但我收到以下错误消息:
{
Error: Invalid status code 401
at ClientRequest.req.on.res (xxxxxxxxxxx)
at emitOne (events.js:96:13)
at ClientRequest.emit (events.js:191:7)
at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:522:21)
at HTTPParser.parserOnHeadersComplete (_http_common.js:99:23)
at TLSSocket.socketOnData (_http_client.js:411:20)
at emitOne (events.js:96:13)
at TLSSocket.emit (events.js:191:7)
at readableAddChunk (_stream_readable.js:178:18)
at TLSSocket.Readable.push (_stream_readable.js:136:10)
at TLSWrap.onread (net.js:561:20)
type: 'FETCH',
sourceUrl: 'https://accounts.google.com/o/oauth2/token',
code: 'EAUTH',
command: 'AUTH XOAUTH2'
}
这是我的代码。我还尝试在初始节点管理器设置中包含刷新令牌和访问令牌,以及包括到期日期。每次我得到相同的结果。
节点制作者设置:
const nodemailer = require('nodemailer')
const transporter = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
type: 'OAuth2',
clientId: 'xxxxxxxxxx',
clientSecret: 'xxxxxxxxxx'
}
});
transporter.on('token', token => {
console.log('A new access token was generated');
console.log('User: %s', token.user);
console.log('Access Token: %s', token.accessToken);
console.log('Expires: %s', new Date(token.expires));
});
电子邮件设置:
const mailOptions = {
from: xxxxxxxxx,
to: xxxxxxxxx,
subject: 'Test Subject',
text: 'This is a test',
html: '<p>This is a test</p>',
auth: {
user: 'xxxxxxxxxxxx',
refreshToken: 'xxxxxxxxxxxxx',
accessToken: 'xxxxxxxxxxxxx'
}
}
发送电子邮件
transporter.sendMail(mailOptions, function(err, info){
if(err){
return console.log(err);
}
console.log('Message %s sent: %s', info.messageId, info.response)
})
有人可以建议可能出现的问题吗?
答案 0 :(得分:0)
选中此SO post可引导您了解有关“刷新令牌”的讨论,请参阅RobKohr和Radioreve的解答。
也许这些OAuth2示例可以帮助您检查代码的差异。
Nodemailer网站的参考:
OAuth2允许您的应用程序存储和使用身份验证令牌 而不是实际的登录凭据。这对于安全性来说非常好 令牌或仅对特定操作有效,可以轻松撤销 因此,一旦被盗,就不能像实际账户一样受到伤害 证书。 Nodemailer中的OAuth2身份验证主要用于 Gmail和G Suite(néeGoogleApps)即使还有其他 支持它的提供商。
OAuth2身份验证所需的访问令牌很短暂 这些需要不时地重新生成。 Nodemailer能够 使用3LO和2LO自动重新生成令牌但是你 也可以自己处理所有令牌。
您可以参考此SO post了解更多信息。
答案 1 :(得分:0)
我知道我在这篇文章上为时已晚。但是我昨天来这里是因为我昨天面临着同样的问题。我已经解决了这个问题,这个问题是一个愚蠢的错误,在任何地方都没有提到。
因此,在Google游乐场页面中创建刷新令牌和访问令牌的过程中存在问题。我选择了正确的范围(https://mail.google.com),但是在创建代码和刷新令牌时,我没有添加我的应用程序客户端ID和密码,而Google默认情况下使用的是游乐场的客户端ID和密码。因此,请小心在操场上添加应用的客户端ID和密码。
添加您的客户ID和密码。 点击右上角的设置按钮。单击复选框,说使用您自己的凭据,然后单击关闭。。现在,如果我们创建访问刷新令牌,则Google会要求对我们的应用(而非Google Playground)进行许可。
它将解决401问题。在创建的任何卡上都没有提到这一点。