Nodemailer / Gmail – 什么是一个刷新令牌,我如何得到一个?

我正在尝试使用nodemailer在节点应用程序中做一个简单的联系表单。 我希望所有的味精都能从我为此目的而创build的Gmail帐户发送到我的个人邮件。

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

经过快速search,似乎我必须从谷歌开发者控制台生成一个ClientIdClientSecret – 我做了 – 但是当涉及到生成一个“刷新令牌”,我完全失去了。

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

我很困惑 :什么是一个刷新令牌,我怎么得到一个?

这个答案的注释original's author:

所以,我终于弄清楚了。 对于那些需要使用GmailNodemailer人来说,我很惊讶我找不到更多的资源

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

尝试创build一个新的用户,如果你已经有一个东西不能正常工作。 这是我的情况。

我希望这会对某人有用,

干杯


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

从这里find的文档:

当用户没有login到您的应用程序时,刷新令牌可以让您的应用程序持续访问Google API。

(……)

注意事项:

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

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

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


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

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

如此处所述,您应该:

  1. 转到Google Developers Console 。
  2. select一个项目,或者创build一个新项目。
  3. 在左侧的边栏中,展开API和身份validation 。 接下来,点击API 。 select“API”部分中的“ 启用API”链接,查看所有启用的API的列表。 确保“Gmail API”位​​于启用的API列表中。 如果您尚未启用API,请从API列表(Google Apps API下)中selectGmail API,然后selectAPI的“ 启用API”button。
  4. 在左边的边栏中,select凭证
  5. 如果您尚未这样做,请通过单击创build新客户端ID并提供创build凭据所需的信息来创build项目的OAuth 2.0凭据。

来自上面链接的博客文章的图像

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

从上面链接的博客图像


请特别注意在控制台中创build新用户时,请将https://developers.google.com/oauthplayground指定为redirectURI 。 否则,你会有一个错误。


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

  1. 转到Google Oauth2.0 Playground 。
  2. 点击右上angular的齿轮button 。 设置从Google Developers Console获取的客户端ID客户端密钥 ,然后select访问令牌位置作为带有承载前缀的授权标头 。 closures这个configuration覆盖。

上面的博客图片

  1. 设置范围。 使用https://mail.google.com/因为它是nodemailer的唯一需求。 然后点击授权APIbutton。

在这里输入图像描述

  1. OAuth2.0授权后,交换令牌和瞧!授权代码 您的刷新令牌即可使用

来自上面指定的博文的图片

对于那些一直在寻找一个工作示例/代码片段的人,请遵循Radioreve的Answer,直到您能够获取访问令牌和刷新令牌。 (基本上,去操场,确保它要求访问发送邮件和mail.google.com,给予许可,交换授权代码令牌)

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

使用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); });