Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Nodemailer/Gmail-什么是刷新令牌,如何获得?_Node.js_Email_Gmail_Token_Nodemailer - Fatal编程技术网

Node.js Nodemailer/Gmail-什么是刷新令牌,如何获得?

Node.js Nodemailer/Gmail-什么是刷新令牌,如何获得?,node.js,email,gmail,token,nodemailer,Node.js,Email,Gmail,Token,Nodemailer,我正在尝试使用nodeEmailer在节点应用程序中创建一个简单的联系人表单。我希望所有的消息都能从我的gmail账户发送到我的个人邮箱 在客户端,我所做的就是获取客户的姓名/邮件/消息并将其发送到服务器。它在本地工作正常,但部署时无法工作(在heroku btw上) 在快速搜索之后,我似乎不得不从谷歌开发者控制台生成ClientId和ClientSecret——我就是这么做的——但当涉及到生成“刷新令牌”时,我完全不知所措 var smtpTransport = nodemailer.

我正在尝试使用
nodeEmailer
在节点应用程序中创建一个简单的联系人表单。我希望所有的消息都能从我的gmail账户发送到我的个人邮箱

在客户端,我所做的就是获取客户的姓名/邮件/消息并将其发送到服务器。它在本地工作正常,但部署时无法工作(在heroku btw上)

在快速搜索之后,我似乎不得不从谷歌开发者控制台生成
ClientId
ClientSecret
——我就是这么做的——但当涉及到生成“刷新令牌”时,我完全不知所措

    var smtpTransport = nodemailer.createTransport("SMTP",{
        service:"Gmail",
        auth:{
            XOAuth2: {
                user:"myaccount@gmail.com",
                clientId:"",
                clientSecret:"",
                refreshToken:""
            }
        }
    });

我很困惑:刷新令牌到底是什么?如何获取

原著作者的注释:

所以,我终于找到了答案。我很惊讶我找不到更多关于这方面的资源,所以对于那些需要使用
Gmail
Nodemailer

我在这里找到了答案:

如果你已经有了一个新的用户,但情况不太好,试着创建一个新用户。对我来说就是这样

我希望这对某人有用

干杯


问题1:刷新令牌到底是什么? 根据找到的文件:

当用户未登录到应用程序时,刷新令牌为应用程序提供对Google API的连续访问

(……)

注意事项:

  • 请确保安全且永久地存储刷新令牌,因为您只能在第一次执行代码交换流时获取刷新令牌

  • 刷新令牌的数量有限制,每个客户端/用户组合有一个限制,所有客户端上每个用户有一个限制。如果您的应用程序请求太多的刷新令牌,它可能会遇到这些限制,在这种情况下,旧的刷新令牌将停止工作

另见和


问题2:我如何得到一个? 步骤1:在获取OAuth 2.0凭据 如上所述,你应该:

  • 去医院
  • 选择一个项目,或创建一个新项目
  • 在左侧的侧栏中,展开api&auth。接下来,单击API。选择API部分中的启用的API链接以查看所有启用的API的列表。确保“Gmail API”在启用的API列表中。如果尚未启用,请从API列表(在Google Apps API下)中选择Gmail API,然后选择API的启用API按钮
  • 在左侧的侧栏中,选择凭据
  • 如果尚未创建项目的OAuth 2.0凭据,请单击“创建新客户端ID”,并提供创建凭据所需的信息,以创建项目的OAuth 2.0凭据
  • 在与每个凭据关联的表中查找客户端ID客户端机密

  • 特别注意指定
    https://developers.google.com/oauthplayground
    在控制台中创建新用户时作为重定向URI。 否则,您将有一个错误


    步骤2:获取位于的刷新令牌
  • 去医院
  • 单击右上角的齿轮按钮。将从中获取的客户端ID客户端机密设置为,并选择访问令牌位置作为带有承载前缀的授权标头。关闭此配置覆盖
  • 设置范围。使用
    https://mail.google.com/
    因为它是nodemailer所需要的。然后单击授权API按钮
  • 在OAuth2.0授权之后,交换令牌的授权代码,然后瞧!您的刷新令牌已准备好使用

  • 对于那些四处寻找工作示例/代码片段的人,请按照Radioreve的回答进行操作,直到您能够获得访问令牌和刷新令牌。(基本上,去游乐场,确保它要求访问发送邮件和mail.google.com,给予许可,交换代币的授权码)

    请注意,我输入的
    expires
    时间是
    newdate().getTime()+2000
    ,接近操场上看到的过期秒数。我不确定是否必须准确输入访问令牌和过期时间,因为它似乎会自动刷新令牌

    使用ECMAScript 6中编写的示例代码:

        const user_name     = 'something@gmail.com';
        const refresh_token = '';
        const access_token  = '';
        const client_id     = '';
        const client_secret = '';
    
        const email_to = 'receiver@gmail.com';
    
        const nodemailer = require('nodemailer');
    
        let transporter = nodemailer
        .createTransport({
            service: 'Gmail',
            auth: {
                type: 'OAuth2',
                clientId: client_id,
                clientSecret: client_secret
            }
        });
        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));
        });
        // setup e-mail data with unicode symbols
        let mailOptions = {
            from    : user_name, // sender address
            to      : email_to, // list of receivers
            subject : 'Hello ✔', // Subject line
            text    : 'Hello world ?', // plaintext body
            html    : '<b>Hello world ?</b>', // html body
    
            auth : {
                user         : user_name,
                refreshToken : refresh_token,
                accessToken  : access_token,
                expires      : 1494388182480
            }
        };
    
        // send mail with defined transport object
        transporter.sendMail(mailOptions, function (error, info) {
            if (error) {
                return console.log(error);
            }
            console.log('Message sent: ' + info.response);
        });
    
    const user\u name='0something@gmail.com';
    const refresh_token='';
    const access_token='';
    const client_id=“”;
    const client_secret='';
    const电邮至receiver@gmail.com';
    const nodemailer=require('nodemailer');
    让transporter=nodeEmailer
    .createTransport({
    服务:“Gmail”,
    认证:{
    类型:“OAuth2”,
    clientId:客户端id,
    clientSecret:client_secret
    }
    });
    transporter.on('token',token=>{
    log(“生成了新的访问令牌”);
    console.log('用户:%s',令牌.User);
    console.log('访问令牌:%s',令牌.accessToken);
    日志('Expires:%s',新日期(token.Expires));
    });
    //使用unicode符号设置电子邮件数据
    让邮件选项={
    发件人:用户名,//发件人地址
    收件人:email_to,//收件人列表
    主题:“你好✔', // 主题行
    text:“Hello world?”,//纯文本正文
    html:‘你好,世界?’,//html正文
    认证:{
    用户:用户名,
    刷新令牌:刷新令牌,
    accessToken:access\u令牌,
    过期日期:1494388182480
    }
    };
    //使用已定义的Transp发送邮件