我尝试使用nodemailer
在节点应用中创建简单的联系表单。我希望所有的msg都是从我为此目的制作的Gmail帐户发送到我的个人邮件。
在客户端,我所做的就是获取客户的名称/邮件/消息并将其发送到服务器。它在本地工作正常但在部署时无法工作(在heroku btw上)。
快速搜索后,似乎我必须从Google Developers Console生成ClientId
和ClientSecret
- 我做了 - 但是在生成"刷新令牌时#34 ;我完全迷失了。
var smtpTransport = nodemailer.createTransport("SMTP",{
service:"Gmail",
auth:{
XOAuth2: {
user:"myaccount@gmail.com",
clientId:"",
clientSecret:"",
refreshToken:""
}
}
});
我很困惑:什么是刷新令牌,我该如何获得?
答案 0 :(得分:69)
本回答原文作者的注释:
所以,我终于弄明白了。我很惊讶我找不到更多关于这方面的资源,所以那些需要
的人Gmail
使用Nodemailer
我在这里找到答案:http://masashi-k.blogspot.fr/2013/06/sending-mail-with-gmail-using-xoauth2.html
尝试创建一个新用户,如果你已经拥有一个并且事情不能正常工作。对我来说就是这样。
我希望这对某人有用,
干杯
从找到的文档here:
刷新令牌可让您的应用在用户未登录您的应用程序时持续访问Google API。
(...)
<强>考虑:强>
请务必安全永久地存储刷新令牌,因为您只能在第一次执行代码交换流时获取刷新令牌。
发布的刷新令牌数量有限制 - 每个客户端/用户组合一个限制,所有客户端的每个用户另一个限制。如果您的应用程序请求过多的刷新令牌,则可能会遇到这些限制,在这种情况下,旧的刷新令牌会停止工作。
另请参阅Offline Access和Using a refresh token。
如上所述here,您应该:
特别注意指定
https://developers.google.com/oauthplayground
在控制台中创建新用户时,将其作为重定向URI 。 否则,您将出错。
https://mail.google.com/
,因为nodemailer
需要{{1}}。然后单击授权API 按钮。
答案 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);
});