大佬教程收集整理的这篇文章主要介绍了node.js – NodeMailer – 使用Google服务帐户发送邮件失败,因为“用户名和密码未被接受”,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
var config = require('./config/mail'); var google = require('./config/google'); var nodemailer = require('nodemailer'); var send = function (args) { let transporter = nodemailer.createTransport({ 'service': 'gmail','auth': { 'type': 'OAuth2','user': google.client_email,'serviceClient': google.client_id,'privateKey': google.private_key } }); transporter.on('token',token => console.log(token)); let message = { 'from': `"${Config.serverFromname}" <${Config.serverFromMail}>`,'to': args.to,'subject': args.subject,'text': args.text,'html': `<p>${args.text}</p>` }; transporter.sendMail(message,(err,info) => { if (err) { console.log('Mail Couldn\'t be sent because: ' + err); } else { console.log('Mail sent'); } }); };
config / google文件包含Google在您创建服务帐户时为您生成的数据. config.serverFromname和config.serverFromMail是发件人的名称和电子邮件(与服务帐户ID不同). args包含食谱电子邮件和内容
当我测试send方法时,我在控制台中收到以下消息:
@H_470_9@mail Couldn't be sent because: Error: Invalid login: 535-5.7.8 Username and password not accepted. Learn more at 535 5.7.8 https://support.google.com/mail/?p=BadCredentials z123sm543690vkd.10 - gsmtp
我知道令牌正在被正确创建,因为我创建的监听器正在打印它:
{ user: 'name@project.iam.gserviceaccount.com',accessToken: 'ya29.ElmIBLxzfU_kkuZeyISeuRBeljmAe7HNTlwuG4K12ysUNo46s-eJ8NkMYHQqD_JrqTlH3yheNc2Aopu9B5vw-ivEqvPR4sTDpWBOg3xUU_4XijeBLno8FHsg',expires: 1500151434603 }
在互联网上搜索我发现它可能是OAuth范围的问题.但是,所有涉及它的信息都是指使用客户端ID,而不是服务帐户.我也没有在Google开发者控制台中找到该选项.
我做错了什么想法?
我在同样的问题上花了无数个小时!我得出结论,谷歌的管理控制台间接地删除了一半这个功能.控制台不提供使用服务帐户第一次授权(用户接受同意屏幕)所需范围的方法.
首先,按照Google Drive API的Node.JS Quickstart说明授权范围并接收刷新令牌.
>转到console.developers.google.com,构建OAuth2.0客户端ID,然后下载client_secret.json文件.
>创建一个单独的临时模块文件夹,并使用NPM下载Google Api模块
npm安装googleapis
npm install google-auth-library
>创建quickstart.js文件
>将client_secret.json文件放在quickstart.js旁边
> quickstart.js中的第7行是用于定义允许应用程序访问的范围的数组.根据需要进行修改.强烈建议仅为预期的内容提供访问权限.见Gmail API Scopes.
> RUN节点quickstart.js
>在浏览器中打开URL,进行身份验证,然后将代码从浏览器复制回终端窗口.这将下载一个nodejs-gmail-quickstart.json文件,该文件将在stdout中提供.
这是您无法为服务帐户完成的部分.此操作将SCOPES数组中提供的范围授权给下载的access_token&刷新令牌.
注意:access_token的使用寿命为1小时. refresh_token是不朽的.
现在你有一个授权的refresh_token!
接下来是在Nodemailer中使用3LO设置auth对象.我会更多地查看底部示例,因为并非所有值都是必需的.我的身份证明如下:
const mailbot = nodemailer.createTransport({ host: 'smtp.gmail.com',port: 587,// TLS (google requires this port for TLS) secure: false,// Not SSL requireTLS: true,// Uses STARTTLS command (nodemailer-ism) auth: { // **HIGHLY RECOMMEND** ALL values be // read in from a file not placed directly in code. // Make sure that file is locked down to only the server daemon type : 'OAuth2',user : config.client_email,scope : "https://www.googleapis.com/auth/gmail.send",clientId : config.client_id,clientSecret: secret,refreshToken: activeToken.refresh_token // AT RUNTIME,it looks like this: //type : 'OAuth2',//user : 'user@gmail.com',// actual user being impersonated //scope : "",//Optional,but recommend to define for the action intended //clientId : '888888888998-9xx9x99xx9x99xx9xxxx9xx9xx9x88x8xxx.apps.googleusercontent.com',//clientSecret: 'XxxxxXXxX0xxxxxxxx0XXxX0',//refreshToken: '1/XXxXxsss-xxxXXXXXxXxx0XXXxxXXx0x00xxx' } });
提示:Gmail将使用授权用户帐户(用户模拟)发送的任何电子邮件重写FROM字段.如果您想稍微自定义,请使用语法{FROM:’“显示名称”<用户电子邮件>‘并且它不会覆盖您的显示名称选择,因为电子邮件匹配.
注意:nodemailer将使用刷新令牌向https://accounts.google.com/o/oauth2/token发出令牌请求,以自动获取access_token.
遗憾的是,nodemailer缺乏将接收到的令牌直接保存到文件中的功能,而只是使用this.emit().如果服务器保持活动状态,则不会出现问题,但由于我的服务器只是爆破,因此每次都会请求新的access_token,因此总会产生延迟.
[安全]希望这适合你!松开私钥加密服务帐户2LO会带来令人失望,但至少这种客户端ID方式很难欺骗.我担心安全问题,但阅读更多我对这个实现很满意.请参阅Google Identity Platform(Nodemailer使用http / REST详细信息)并给出
您正在使用TLS最初连接授权代码,然后将其与您的客户端ID数据匹配,以及refresh_token(您必须经历我们上面所做的麻烦)然后您可以接收access_token以实际与Google Api交互.
只要您通过尽可能保持OAuth2.0客户端ID(高度随机的用户名),密码和刷新令牌保持独立,安全和隐藏来增加安全状态,您就应该能够安然入睡.祝好运!
以上是大佬教程为你收集整理的node.js – NodeMailer – 使用Google服务帐户发送邮件失败,因为“用户名和密码未被接受”全部内容,希望文章能够帮你解决node.js – NodeMailer – 使用Google服务帐户发送邮件失败,因为“用户名和密码未被接受”所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。