尝试创建草稿时出现 '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): 尝试添加 FromToSubject 字段:

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)
})