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

Rad*_*eve 28 email gmail token node.js nodemailer

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

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

快速搜索后,看来我必须生成一个ClientIdClientSecret来自谷歌开发者控制台-我做到了-但是,当涉及到产生"刷新令牌" iI'm完全丧失.

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

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

Rad*_*eve 70

本回答原文作者:

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

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

尝试创建一个新用户,如果你已经有一个用户工作不正常.对我来说就是这样.

我希望这对某人有用,

干杯


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

从技术文档发现这里:

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

(......)

注意事项:

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

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

另请参阅Offline Access使用刷新令牌.


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

第1步:在Google Developers Console中获取OAuth 2.0凭据

如前所述这里,你应该:

  1. 转到Google Developers Console.
  2. 选择一个项目,或创建一个新项目.
  3. 在左侧的侧栏中,展开API和auth.接下来,单击API.选择API部分中的Enabled APIs链接以查看所有已启用API的列表.确保"Gmail API"位​​于已启用的API列表中.如果您尚未启用它,请从API列表中选择Gmail API(在Google Apps API下),然后选择API的" 启用API"按钮.
  4. 在左侧的边栏中,选择凭据.
  5. 如果尚未执行此操作,请通过单击" 创建新客户端ID "并提供创建凭据所需的信息来创建项目的OAuth 2.0 凭据.

上面链接的博客文章中的图片

  1. 在与每个凭据关联的表中查找客户端ID客户端密钥.

来自上面链接的博客帖子的图片


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


第2步:在Google OAuth2.0 Playground获取刷新令牌

  1. 转到Google Oauth2.0 Playground.
  2. 单击右上角的齿轮按钮.设置从Google Developers Console获取的客户端ID客户端密钥,并选择访问令牌位置作为授权标头w/Bearer前缀.关闭此配置叠加层.

来自上面的博客文章的图片

  1. 设置范围.使用,https://mail.google.com/因为它是需要的nodemailer.然后单击" 授权API"按钮.

在此输入图像描述

  1. OAuth2.0授权后,交换令牌和voilá的授权码!您的刷新令牌已准备就绪

来自上面指定的博客帖子的图片

  • 谢谢,这有帮助!很难获得有关此信息的信息. (10认同)
  • 对于像我这样阅读速度过快的人:`https://developers.google.com/oauthplayground/`(注意最后的 `/`)不起作用!只有 `https://developers.google.com/oauthplayground` 有效。 (2认同)

Log*_*gan 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);
    });
Run Code Online (Sandbox Code Playgroud)

  • 这似乎会在每封发送的电子邮件中触发新令牌,这有什么原因吗? (2认同)