为什么OAuth2和Gmail Nodejs nodeEmailer一起生产;“不接受用户名和密码”;错误

为什么OAuth2和Gmail Nodejs nodeEmailer一起生产;“不接受用户名和密码”;错误,oauth,oauth-2.0,gmail,google-apps,nodemailer,Oauth,Oauth 2.0,Gmail,Google Apps,Nodemailer,OAuth2在尝试使用Gmail+Nodejs+NodeEmailer发送电子邮件时出现“用户名和密码不被接受”错误 代码-Nodejs-Nodemailer和xoauth2 var nodemailer = require("nodemailer"); var generator = require('xoauth2').createXOAuth2Generator({ user: "", // Your gmail address. clientId: "", c

OAuth2在尝试使用Gmail+Nodejs+NodeEmailer发送电子邮件时出现“用户名和密码不被接受”错误

代码-Nodejs-Nodemailer和xoauth2

var nodemailer = require("nodemailer");

var generator = require('xoauth2').createXOAuth2Generator({
    user: "", // Your gmail address.

    clientId: "",
    clientSecret: "",
    refreshToken: "",
});



// listen for token updates
// you probably want to store these to a db
generator.on('token', function(token){
    console.log('New token for %s: %s', token.user, token.accessToken);
});


// login
var smtpTransport = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        xoauth2: generator
    }
});


var mailOptions = {
    to: "",
    subject: 'Hello ', // Subject line
    text: 'Hello world ', // plaintext body
    html: '<b>Hello world </b>' // html body
};


smtpTransport.sendMail(mailOptions, function(error, info) {
  if (error) {
    console.log(error);
  } else {
    console.log('Message sent: ' + info.response);
  }
  smtpTransport.close();
});
var nodemailer=require(“nodemailer”);
var生成器=需要('xoauth2')。createXOAuth2Generator({
用户:,//您的gmail地址。
客户ID:“,
客户机密:“,
刷新令牌:“”,
});
//侦听令牌更新
//您可能希望将这些存储到数据库中
生成器.on('token',函数(token){
console.log('s的新令牌:%s',token.user,token.accessToken);
});
//登录
var smtpTransport=nodemailer.createTransport({
服务:“gmail”,
认证:{
xoauth2:生成器
}
});
var mailpoptions={
至:“,
主题://你好,//主题行
text:'你好,世界',//纯文本正文
html:'Hello world'//html正文
};
发送邮件(邮件选项,函数(错误,信息){
如果(错误){
console.log(错误);
}否则{
console.log('发送的消息:'+信息响应);
}
smtpTransport.close();
});
问题:

  • 我使用谷歌OAuth2游乐场创建代币

  • 它使用refreshToken(即,它在屏幕上打印新的访问令牌)获取有效的accessToken ok。在尝试发送电子邮件之前,不会出现错误

  • 我添加了可选的accessToken:但得到了相同的错误。(“不接受用户名和密码”)

  • 我不是100%确定“用户名”,文档说它需要一个“用户”电子邮件地址-我猜是创建token的帐户的电子邮件,但不是100%清楚。我试过好几种方法,但没有一种有效

  • 我搜索了gmail账户上的选项,没有发现任何错误

  • 另外,当我用Java做这件事时,它需要google用户ID而不是电子邮件地址,不知道为什么它使用电子邮件地址,而Java使用用户ID

NodeEmailer在“撰写”范围内失败 问题是“范围”

它失败于:

但是如果我用的话,效果还可以

只需执行以下操作:

1-从这里获取credentials.json文件按enable the Gmail API,然后选择Desktop app

2-将此文件与凭据文件一起保存在某个位置

const fs=require('fs');
const readline=require('readline');
const{google}=require('googleapis');
//如果修改这些作用域,请删除token.json。
常量作用域=['https://mail.google.com'];
//文件token.json存储用户的访问和刷新令牌,并且
//在第一次完成授权流时自动创建
//时间。
const TOKEN_PATH='TOKEN.json';
//从本地文件加载客户端机密。
fs.readFile('credentials.json',(err,content)=>{
如果(错误){
返回console.log('加载客户端机密文件时出错:',错误);
}
//使用凭据授权客户端,然后调用Gmail API。
authorize(JSON.parse(content),getAuth);
});
/**
*使用给定的凭据创建OAuth2客户端,然后执行
*给定回调函数。
*@param{Object}凭据授权客户端凭据。
*@param{function}回调使用授权客户端调用的回调。
*/
函数授权(凭据、回调){
const{client\u secret,client\u id,redirect\u uris}=credentials.installed;
const oAuth2Client=new google.auth.OAuth2(客户端id、客户端机密、重定向URI[0]);
//检查我们以前是否存储过令牌。
fs.readFile(令牌路径,(错误,令牌)=>{
如果(错误){
返回getNewToken(oAuth2Client,回调);
}
oAuth2Client.setCredentials(JSON.parse(token));
回调(oAuth2Client);
});
}
/**
*提示用户授权后获取并存储新令牌,然后
*使用授权的OAuth2客户端执行给定的回调。
*@param{google.auth.OAuth2}OAuth2客户端为OAuth2客户端获取令牌。
*@param{getEventsCallback}回调授权客户端的回调。
*/
函数getNewToken(oAuth2Client,回调){
const authUrl=oAuth2Client.generateAuthUrl({
访问类型:“脱机”,
范围:范围,
});
log('通过访问此url授权此应用:',authUrl);
const rl=readline.createInterface({
输入:process.stdin,
输出:process.stdout,
});
rl.question('在此处输入该页面的代码:',(代码)=>{
rl.close();
oAuth2Client.getToken(代码,(错误,标记)=>{
if(err)返回console.error('检索访问令牌时出错',err);
oAuth2Client.setCredentials(令牌);
//将令牌存储到磁盘,以便以后执行程序
fs.writeFile(TOKEN_PATH,JSON.stringify(TOKEN),(err)=>{
if(err)返回控制台。error(err);
日志('令牌存储到',令牌路径);
});
回调(oAuth2Client);
});
});
}
函数getAuth(auth){

}
即使使用了正确的作用域,我也面临着类似的问题。您是否意识到任何可能导致这种情况的问题?(我在这里解释了我的问题:)@Abdel RahmanShoman我在github上的“NodeEmailer”上留下了一个问题-他们说是范围,这为我解决了问题。我们应该使用什么范围@eddyparkinson@ngLover请参阅范围值-Gmail API v1-在这里,当我使用send scope()时也发生了同样的情况,使用了推荐的范围,一切都进行得很顺利