Nodemailer / Gmail - 什么是刷新令牌,我该如何获得?

时间:2014-06-07 14:54:43

标签: node.js email gmail token nodemailer

我尝试使用nodemailer在节点应用中创建简单的联系表单。我希望所有的msg都是从我为此目的制作的Gmail帐户发送到我的个人邮件。

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

快速搜索后,似乎我必须从Google Developers Console生成ClientIdClientSecret - 我做了 - 但是在生成"刷新令牌时#34 ;我完全迷失了。

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

我很困惑:什么是刷新令牌,我该如何获得?

2 个答案:

答案 0 :(得分:69)

本回答原文作者的注释:

  

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

的人      

我在这里找到答案:http://masashi-k.blogspot.fr/2013/06/sending-mail-with-gmail-using-xoauth2.html

     

尝试创建一个新用户,如果你已经拥有一个并且事情不能正常工作。对我来说就是这样。

     

我希望这对某人有用,

     

干杯


问题1:刷新令牌究竟是什么?

从找到的文档here

  

刷新令牌可让您的应用在用户未登录您的应用程序时持续访问Google API。

     

(...)

     

<强>考虑:

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

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

  •   

另请参阅Offline AccessUsing a refresh token


问题2:我如何获得一个?

第1步:在Google Developers Console

获取OAuth 2.0凭据

如上所述here,您应该:

  1. 转到Google Developers Console
  2. 选择一个项目,或创建一个新项目。
  3. 在左侧边栏中,展开 API&amp; AUTH 即可。接下来,单击 API 。选择API部分中的已启用的API 链接,以查看所有已启用的API的列表。确保“Gmail API”位​​于已启用的API列表中。如果您尚未启用,请从API列表中选择Gmail API(在Google Apps API下),然后选择API的启用API 按钮。
  4. 在左侧边栏中,选择凭据
  5. 如果您还没有这样做,请点击创建新的客户ID ,然后提供创建凭据所需的信息,创建项目的OAuth 2.0凭据。
  6. Image from the blog post linked above

    1. 在与您的每个凭据相关联的表格中查找客户端ID 客户端密钥
    2. Image from the blogpost linked above


        

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


      步骤2:在Google OAuth2.0 Playground

      获取刷新令牌
      1. 转到Google Oauth2.0 Playground
      2. 点击右上角的齿轮按钮。设置从Google Developers Console获取的客户ID 客户端密钥,然后选择访问令牌位置作为授权标头w /持票人前缀。关闭此配置覆盖。
      3. Image from the blogpost above

        1. 设置范围。使用https://mail.google.com/,因为nodemailer需要{{1}}。然后单击授权API 按钮。
        2. enter image description here

          1. OAuth2.0授权后,交换令牌和voilá的授权码!您的刷新令牌已准备就绪
          2. Image from the blogpost specified above

答案 1 :(得分:5)

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

请注意,我输入的expires时间是new Date().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);
    });