Nodemailer / Gmail – 什么是一个刷新令牌,我如何得到一个?
我正在尝试使用nodemailer
在节点应用程序中做一个简单的联系表单。 我希望所有的味精都能从我为此目的而创build的Gmail帐户发送到我的个人邮件。
在客户端,我所做的只是获取客户的名称/邮件/消息并将其发送到服务器。 它在本地正常工作,但部署时失效(在heroku btw)。
经过快速search,似乎我必须从谷歌开发者控制台生成一个ClientId
和ClientSecret
– 我做了 – 但是当涉及到生成一个“刷新令牌”,我完全失去了。
var smtpTransport = nodemailer.createTransport("SMTP",{ service:"Gmail", auth:{ XOAuth2: { user:"myaccount@gmail.com", clientId:"", clientSecret:"", refreshToken:"" } } });
我很困惑 :什么是一个刷新令牌,我怎么得到一个?
这个答案的注释original's author:
所以,我终于弄清楚了。 对于那些需要使用
Gmail
和Nodemailer
人来说,我很惊讶我找不到更多的资源我在这里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凭据
如此处所述,您应该:
- 转到Google Developers Console 。
- select一个项目,或者创build一个新项目。
- 在左侧的边栏中,展开API和身份validation 。 接下来,点击API 。 select“API”部分中的“ 启用API”链接,查看所有启用的API的列表。 确保“Gmail API”位于启用的API列表中。 如果您尚未启用API,请从API列表(Google Apps API下)中selectGmail API,然后selectAPI的“ 启用API”button。
- 在左边的边栏中,select凭证 。
- 如果您尚未这样做,请通过单击创build新客户端ID并提供创build凭据所需的信息来创build项目的OAuth 2.0凭据。
- 在与每个凭证关联的表中查找客户端ID和客户端密钥 。
请特别注意在控制台中创build新用户时,请将
https://developers.google.com/oauthplayground
指定为redirectURI 。 否则,你会有一个错误。
步骤2:在Google OAuth2.0 Playground上获取刷新令牌
- 转到Google Oauth2.0 Playground 。
- 点击右上angular的齿轮button 。 设置从Google Developers Console获取的客户端ID和客户端密钥 ,然后select访问令牌位置作为带有承载前缀的授权标头 。 closures这个configuration覆盖。
- 设置范围。 使用
https://mail.google.com/
因为它是nodemailer
的唯一需求。 然后点击授权APIbutton。
- 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); });