43

我正在尝试在节点应用程序中使用nodemailer. 我希望所有的味精都从我为此目的创建的 gmail 帐户发送到我的个人邮件。

在客户端,我所做的只是获取客户的姓名/邮件/消息并将其发送到服务器。它在本地运行良好,但在部署时无法运行(顺便说一句,在 heroku 上)。

快速搜索后,似乎我必须从 Google Developers Console 生成一个ClientIdand ClientSecret——我确实这样做了——但是在生成“刷新令牌”时,我完全迷路了。

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

我很困惑:究竟什么是刷新令牌,我如何获得一个?

4

2 回答 2

106

此答案原作者的注释:

所以,我终于设法弄清楚了。我很惊讶我找不到更多关于这方面的资源,所以对于那些需要使用的人Gmail来说Nodemailer

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

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

我希望这对某人有用,

干杯


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

这里找到的文档:

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

(...)

注意事项:

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

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

另请参阅脱机访问使用刷新令牌


问题2:如何获得?

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

如此处所述,您应该:

  1. 转到Google 开发者控制台
  2. 选择一个项目,或创建一个新项目。
  3. 在左侧边栏中,展开APIs & auth。接下来,单击API。选择 API 部分中的已启用 API链接以查看所有已启用 API 的列表。确保“Gmail API”在启用的 API 列表中。如果您尚未启用它,请从 API 列表中选择 Gmail API(在 Google Apps API 下),然后选择 API 的启用 API按钮。
  4. 在左侧边栏中,选择Credentials
  5. 如果您还没有这样做,请单击Create new Client 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获得的Client IDClient Secret,然后选择Access token location作为Authorization header w/ Bearer prefix。关闭此配置覆盖。

图片来自上面的博文

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

在此处输入图像描述

  1. OAuth2.0授权后,用授权码交换令牌,瞧!您的刷新令牌已准备好使用

图片来自上面指定的博文

于 2014-06-09T15:29:07.013 回答
7

对于那些一直在寻找工作示例/代码片段的人,请按照 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);
    });
于 2017-05-11T07:12:08.410 回答