尝试创建草稿时出现 'Missing draft message' 401 错误
A 'Missing draft message' 401 error while trying to create a draft
在 https://gmail.googleapis.com/gmail/v1/users/${user_id}/drafts
尝试 POST
以创建 gmail 草稿时,我收到 Missing draft message
错误提示。
这是发出请求的实际代码:
let userMail = axios.post(`https://gmail.googleapis.com/gmail/v1/users/${user_id}/drafts`,
{
body: {
draft: {
message: {
raw: "Hard Coded mail",
}
}
}
},
{
headers: {
Authorization: `Bearer ${access_token}`,
}
})
console.log(userMail)
console.log(userMail)
显示了一堆信息如:
data: {
error: {
code: 400,
message: 'Missing draft message',
errors: [
{
message: 'Missing draft message',
domain: 'global',
reason: 'invalidArgument'
}
],
status: 'INVALID_ARGUMENT'
}
}
我是否遗漏了请求的 body
中的某些内容,或者语法不正确?
根据此线程 Missing draft message - javascript Gmail API - how to structure body of the request?,
"The correct structure of the request:"
'draft': {
'message': {
'raw': base64EncodedEmail
}
}
PS: 我没有使用外部节点模块,保持它的“vanilla”
编辑 (1):
尝试添加 From
、To
和 Subject
字段:
var message = 'MIME-Version: 1.0\r\n' +
'Content-type: multipart/alternative; boundary=boundaryboundary\r\n\r\n' +
'From: ' + from + "\r\n" +
'To: ' + to + "\r\n" +
'Subject: ' + subject + "\r\n" +
'--boundaryboundary\r\n' +
'Content-type: text/plain; charset=UTF-8\r\n' +
mailContent + "\r\n\r\n" +
'--boundaryboundary--';
修改点:
在你的情况下,请求body是JSON.stringify({"message": {"raw": data}})
。
请在请求中包含 "Content-Type": "application/json"
header。
当您要放置Hard Coded mail
的文本时,请按如下方式创建请求body。
MIME-Version: 1.0
Content-type: multipart/alternative; boundary=boundaryboundary
--boundaryboundary
Content-type: text/plain; charset=UTF-8
Hard Coded mail
--boundaryboundary--
并且,请将上述请求body编码为websafe-base64数据。
当这些点体现在你的脚本中,就变成了下面这样。
修改后的脚本:
var user_id = "me";
var text = "Hard Coded mail";
var message = 'MIME-Version: 1.0\r\n' +
'Content-type: multipart/alternative; boundary=boundaryboundary\r\n\r\n' +
'--boundaryboundary\r\n' +
'Content-type: text/plain; charset=UTF-8\r\n' +
text + "\r\n\r\n" +
'--boundaryboundary--';
var blob = new Blob([message], {type:"text/plain"});
var f = new FileReader();
f.readAsDataURL(blob);
f.onload = d => {
var base64 = d.target.result.replace(/_/g, '/').replace(/-/g, '+').split(",")[1];
axios.post(`https://gmail.googleapis.com/gmail/v1/users/${user_id}/drafts`,
JSON.stringify({"message": {"raw": base64}}),
{headers: {Authorization: `Bearer ${access_token}`, "Content-Type": "application/json"}}
).then((res) => {
console.log(res.data)
}).catch((error) => {
console.error(error.response.data.error)
})
}
结果:
当此脚本为 运行 时,日志中显示以下结果。
{
"id":"###",
"message":{
"id":"###",
"threadId":"###",
"labelIds":[
"DRAFT"
]
}
}
参考:
已添加:
作为另一种方法,下面的修改脚本怎么样?在这个修改中,没有使用blob
。并使用 message/rfc822
的内容类型。在这种情况下,端点更改为 https://gmail.googleapis.com/upload/gmail/v1/users/${user_id}/drafts
。请注意这一点。
修改后的脚本:
var user_id = "me";
var text = "Hard Coded mail";
var message = 'MIME-Version: 1.0\r\n' +
'Content-type: multipart/alternative; boundary=boundaryboundary\r\n\r\n' +
'--boundaryboundary\r\n' +
'Content-type: text/plain; charset=UTF-8\r\n' +
text + "\r\n\r\n" +
'--boundaryboundary--';
axios.post(`https://gmail.googleapis.com/upload/gmail/v1/users/${user_id}/drafts`,
message,
{headers: {Authorization: `Bearer ${access_token}`, "Content-Type": "message/rfc822"}}
).then((res) => {
console.log(JSON.stringify(res.data))
}).catch((error) => {
console.error(error.response.data.error)
})
在 https://gmail.googleapis.com/gmail/v1/users/${user_id}/drafts
尝试 POST
以创建 gmail 草稿时,我收到 Missing draft message
错误提示。
这是发出请求的实际代码:
let userMail = axios.post(`https://gmail.googleapis.com/gmail/v1/users/${user_id}/drafts`,
{
body: {
draft: {
message: {
raw: "Hard Coded mail",
}
}
}
},
{
headers: {
Authorization: `Bearer ${access_token}`,
}
})
console.log(userMail)
console.log(userMail)
显示了一堆信息如:
data: {
error: {
code: 400,
message: 'Missing draft message',
errors: [
{
message: 'Missing draft message',
domain: 'global',
reason: 'invalidArgument'
}
],
status: 'INVALID_ARGUMENT'
}
}
我是否遗漏了请求的 body
中的某些内容,或者语法不正确?
根据此线程 Missing draft message - javascript Gmail API - how to structure body of the request?,
"The correct structure of the request:"
'draft': {
'message': {
'raw': base64EncodedEmail
}
}
PS: 我没有使用外部节点模块,保持它的“vanilla”
编辑 (1):
尝试添加 From
、To
和 Subject
字段:
var message = 'MIME-Version: 1.0\r\n' +
'Content-type: multipart/alternative; boundary=boundaryboundary\r\n\r\n' +
'From: ' + from + "\r\n" +
'To: ' + to + "\r\n" +
'Subject: ' + subject + "\r\n" +
'--boundaryboundary\r\n' +
'Content-type: text/plain; charset=UTF-8\r\n' +
mailContent + "\r\n\r\n" +
'--boundaryboundary--';
修改点:
在你的情况下,请求body是
JSON.stringify({"message": {"raw": data}})
。请在请求中包含
"Content-Type": "application/json"
header。当您要放置
Hard Coded mail
的文本时,请按如下方式创建请求body。MIME-Version: 1.0 Content-type: multipart/alternative; boundary=boundaryboundary --boundaryboundary Content-type: text/plain; charset=UTF-8 Hard Coded mail --boundaryboundary--
并且,请将上述请求body编码为websafe-base64数据。
当这些点体现在你的脚本中,就变成了下面这样。
修改后的脚本:
var user_id = "me";
var text = "Hard Coded mail";
var message = 'MIME-Version: 1.0\r\n' +
'Content-type: multipart/alternative; boundary=boundaryboundary\r\n\r\n' +
'--boundaryboundary\r\n' +
'Content-type: text/plain; charset=UTF-8\r\n' +
text + "\r\n\r\n" +
'--boundaryboundary--';
var blob = new Blob([message], {type:"text/plain"});
var f = new FileReader();
f.readAsDataURL(blob);
f.onload = d => {
var base64 = d.target.result.replace(/_/g, '/').replace(/-/g, '+').split(",")[1];
axios.post(`https://gmail.googleapis.com/gmail/v1/users/${user_id}/drafts`,
JSON.stringify({"message": {"raw": base64}}),
{headers: {Authorization: `Bearer ${access_token}`, "Content-Type": "application/json"}}
).then((res) => {
console.log(res.data)
}).catch((error) => {
console.error(error.response.data.error)
})
}
结果:
当此脚本为 运行 时,日志中显示以下结果。
{
"id":"###",
"message":{
"id":"###",
"threadId":"###",
"labelIds":[
"DRAFT"
]
}
}
参考:
已添加:
作为另一种方法,下面的修改脚本怎么样?在这个修改中,没有使用blob
。并使用 message/rfc822
的内容类型。在这种情况下,端点更改为 https://gmail.googleapis.com/upload/gmail/v1/users/${user_id}/drafts
。请注意这一点。
修改后的脚本:
var user_id = "me";
var text = "Hard Coded mail";
var message = 'MIME-Version: 1.0\r\n' +
'Content-type: multipart/alternative; boundary=boundaryboundary\r\n\r\n' +
'--boundaryboundary\r\n' +
'Content-type: text/plain; charset=UTF-8\r\n' +
text + "\r\n\r\n" +
'--boundaryboundary--';
axios.post(`https://gmail.googleapis.com/upload/gmail/v1/users/${user_id}/drafts`,
message,
{headers: {Authorization: `Bearer ${access_token}`, "Content-Type": "message/rfc822"}}
).then((res) => {
console.log(JSON.stringify(res.data))
}).catch((error) => {
console.error(error.response.data.error)
})