gmail.users.labels.list()
使用Google的Node.js API时,尝试发送电子邮件时出现错误。错误是:
{ "code": 403, "errors": [{ "domain": "global", "reason": "insufficientPermissions", "message": "Insufficient Permission" }] }
fs.readFile(secretlocation, function processClientSecrets(err, content) { if (err) { console.log('Error loading client secret file: ' + err); return; } authorize(JSON.parse(content), sendMessage); }); function sendMessage(auth) { var raw = makeBody('myrealmail@gmail.com', 'myrealmail@gmail.com', 'subject', 'message test'); gmail.users.messages.send({ auth: auth, userId: 'me', message: { raw: raw } }, function(err, response) { res.send(err || response) }); }
该功能processClientSecrets来自我上面提到的Google指南。它将读取.json包含access_token和的文件refresh_token。该makeBody功能是使编码的正文消息。
processClientSecrets
.json
access_token
refresh_token
makeBody
在配置变量中,我还具有:
var SCOPES = [ 'https://mail.google.com/', 'https://www.googleapis.com/auth/gmail.modify', 'https://www.googleapis.com/auth/gmail.compose', 'https://www.googleapis.com/auth/gmail.send' ];
我的设置错了吗?API是否进行了更改?我想念什么?
好的,所以我发现了问题。
问题1: 在遵循Node.js快速入门指南的同时,该教程中的示例
var SCOPES = ['https://www.googleapis.com/auth/gmail.readonly'];
当我得到的时候.json,看起来像:
{ "access_token": "xxx_a_long_secret_string_i_hided_xxx", "token_type": "Bearer", "refresh_token": "xxx_a_token_i_hided_xxx", "expiry_date": 1451721044161 }
产生的那些标记 仅 考虑auth/gmail.readonly了教程代码中的范围。
auth/gmail.readonly
所以我删除了第一个.json,从我的最终作用域数组中添加了作用域(我在问题中发帖了),然后再次运行了教程设置,得到了一个新令牌。
问题二
在传递给API的对象中,我正在发送:
{ auth: auth, userId: 'me', message: { raw: raw } }
但这是错误的,message应该调用key resource。
message
resource
这是我添加到教程代码中的内容:
function makeBody(to, from, subject, message) { var str = ["Content-Type: text/plain; charset=\"UTF-8\"\n", "MIME-Version: 1.0\n", "Content-Transfer-Encoding: 7bit\n", "to: ", to, "\n", "from: ", from, "\n", "subject: ", subject, "\n\n", message ].join(''); var encodedMail = new Buffer(str).toString("base64").replace(/\+/g, '-').replace(/\//g, '_'); return encodedMail; } function sendMessage(auth) { var raw = makeBody('myrealemail@gmail.com', 'myrealemail@gmail.com', 'test subject', 'test message'); gmail.users.messages.send({ auth: auth, userId: 'me', resource: { raw: raw } }, function(err, response) { res.send(err || response) }); }
并使用以下命令调用所有内容:
fs.readFile(secretlocation, function processClientSecrets(err, content) { if (err) { console.log('Error loading client secret file: ' + err); return; } // Authorize a client with the loaded credentials, then call the // Gmail API. authorize(JSON.parse(content), sendMessage); });