Node.js GMail API使用POST请求,错误代码:400,需要收件人地址
我正试图通过GMail API使用POST请求发送一封电子邮件,该请求仅包含NodeJS v8.10中的节点标准模块。 下面给出了示例代码 我得到一个错误:Node.js GMail API使用POST请求,错误代码:400,需要收件人地址,node.js,email,gmail-api,Node.js,Email,Gmail Api,我正试图通过GMail API使用POST请求发送一封电子邮件,该请求仅包含NodeJS v8.10中的节点标准模块。 下面给出了示例代码 我得到一个错误: { “错误”:{ “错误”:[ { “域”:“全局”, “理由”:“无效辩论”, “邮件”:“需要收件人地址” } ], “代码”:400, “邮件”:“需要收件人地址” } } 它说需要收件人地址,但根据我的想法,(我可能错了),我的base64url转换是正确的,因为我在Google API Explorer中检查了它,但我的问题是传
{
“错误”:{
“错误”:[
{
“域”:“全局”,
“理由”:“无效辩论”,
“邮件”:“需要收件人地址”
}
],
“代码”:400,
“邮件”:“需要收件人地址”
}
}
它说需要收件人地址,但根据我的想法,(我可能错了),我的base64url转换是正确的,因为我在Google API Explorer中检查了它,但我的问题是传递数据,我按照指南中的说明正确地做了,即在体内使用“原始”键,但仍然不起作用,这就是我的问题所在。也许我遗漏了什么,也许我不知道正确的结构
是的,关于这一点有多篇文章,但没有一篇提供解决方案。
我参考了《指南》
但给出的示例对于客户端库的使用非常有用
我尝试了一切,将带有base64url编码数据的“raw”传递到请求的write函数中,在options中作为数据参数传递,在options中通过body参数传递,我能想到的一切
我错过什么了吗?我哪里做错了
我是nodejs的新手,所以请解释一下,如果可能的话,我们非常欢迎提供一个解决方案的示例结构
我想Base64url工作正常。我复制了转换生成的字符串,并在
它可以正常工作并向我发送邮件,但对我的代码不起作用
var电子邮件=(
“内容类型:文本/纯文本;字符集=\“UTF-8\”\n”+
“内容长度:5000\n”+
“MIME版本:1.0\n”+
“内容传输编码:消息/rfc2822\n”+
“至:something@something.com\n“+
“发件人:\“某个姓名\”\n”+
“主题:Hello world\n\n”+
“实际的消息文本显示在此处”
);
异步函数sendMail(令牌,resp){
返回新承诺((解决、拒绝)=>{
var base64encodemail=Buffer.from(email.toString('base64');
var base64urlEncodedEmail=base64encodedmail.replace(//\+/g',-')。replace(//\//g',-');
变量参数={
userId:'我',
资源:{
“原始”:base64urlEncodedEmail
}
};
变量2={
“原始”:base64urlEncodedEmail,
}
变量选项={
主机名:“www.googleapis.com”,
路径:'/upload/gmail/v1/users/me/messages/send',
标题:{
“授权”:“持票人”+代币,
“内容类型”:“消息/rfc822”,
},
正文:{
“原始”:base64urlEncodedEmail,
“资源”:{
“原始”:base64urlEncodedEmail,
}
},
数据:JSON.stringify({
“原始”:base64urlEncodedEmail,
“资源”:{
“原始”:base64urlEncodedEmail,
}
}),
信息:{
“原始”:base64urlEncodedEmail,
},
有效载荷:{
“raw”:base64urlEncodedEmail,//这是我在尝试我能想到的一切
},
//身体:生的,
// }
userId:'我',
//资源:{
//“原始”:base64urlEncodedEmail
// },
方法:“POST”,
};
变量id=“”;
console.log(base64urlEncodedEmail);
const req=https.request(选项,(res)=>{
变量体=“”;
res.on('数据',(d)=>{
body+=d;
});
res.on('结束',()=>{
var parsed=body;
console.log(已解析);
})
});
请求开启('错误',(e)=>{
控制台错误(e);
});
请求写入(JSON.stringify(body2));
请求结束();
});
};
谢谢您的时间和回答。我找到了解决方案
它说everywhere将rfc822格式的字符串转换为Base64url以发送并将其附加到帖子正文中的“raw”属性,但我不知道发生了什么变化,您不需要再这样做了
首先,标题中的内容类型应为
'Content-Type':'message/rfc822'
现在,由于我们将内容类型指定为message/rfc822,我想,我们不需要再将要发送的数据转换为base64url格式(不确定原因,因为我对此知之甚少)
仅传递给:something@any.com“身体在工作
下面是一个完整的代码,说明了如何为一个正在为同样的问题奋斗的人完成它
function makeBody(to, from, subject, message) {
let str = [
"to: ", to, "\n",
"from: ", from, "\n",
"subject: ", subject, "\n\n",
message,
].join('');
return str;
}
async function getIdAsync(token,resp) {
return new Promise((resolve,reject) => {
let raw = makeBody("something@gmail.com", "something@gmail.com", "Subject Here", "blah blah blah");
var options = {
hostname: 'www.googleapis.com',
path:'/upload/gmail/v1/users/me/messages/send',
headers: {
'Authorization':'Bearer '+token,
'Content-Type':'message/rfc822'
},
method: 'POST',
};
const req = https.request(options, (res) => {
var body = '';
res.on('data', (d) => {
body += d;
});
res.on('end', () => {
var parsed = body;
console.log(parsed);
})
});
req.on('error', (e) => {
console.error(e);
});
req.write(raw);
req.end();
});
};
快乐编码:)我建议您使用现有的库,例如,可能有助于深入了解node.js library@ejbбббббб,我需要将simpile POST请求与GMail API本身一起使用。谢谢你的推荐,我也会看看的。