Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js GMail API使用POST请求,错误代码:400,需要收件人地址_Node.js_Email_Gmail Api - Fatal编程技术网

Node.js GMail API使用POST请求,错误代码:400,需要收件人地址

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中检查了它,但我的问题是传

我正试图通过GMail API使用POST请求发送一封电子邮件,该请求仅包含NodeJS v8.10中的节点标准模块。 下面给出了示例代码

我得到一个错误:

{
“错误”:{
“错误”:[
{
“域”:“全局”,
“理由”:“无效辩论”,
“邮件”:“需要收件人地址”
}
],
“代码”: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本身一起使用。谢谢你的推荐,我也会看看的。