【问题标题】:A 'Missing draft message' 401 error while trying to create a draft尝试创建草稿时出现“缺少草稿消息”401 错误
【发布时间】:2022-03-03 22:29:33
【问题描述】:

在尝试 POST https://gmail.googleapis.com/gmail/v1/users/${user_id}/drafts 时,为了创建 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?

"请求的正确结构:"

'draft': {
  'message': {
    'raw': base64EncodedEmail
  }
}

PS:我没有使用外部节点模块,保持“原版”

编辑(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--';

【问题讨论】:

    标签: axios request gmail gmail-api


    【解决方案1】:

    修改点:

    • 在您的情况下,请求正文是JSON.stringify({"message": {"raw": data}})

    • 请在请求标头中包含"Content-Type": "application/json"

    • 当您要放置Hard Coded mail的文本时,请按如下方式创建请求正文。

        MIME-Version: 1.0
        Content-type: multipart/alternative; boundary=boundaryboundary
      
        --boundaryboundary
        Content-type: text/plain; charset=UTF-8
        Hard Coded mail
      
        --boundaryboundary--
      
    • 并且,请将上述请求正文编码为 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)
    })
    

    【讨论】:

    • 感谢详细和逐步的答案。尽管我仍然遇到new Blob(...)not a constructor (TypeError) 的问题。我尝试按照一些 SO an GH 线程中的建议添加以下要求,但没有成功。 const Blob = require('buffer')
    • @HCKRMVT 感谢您的回复。我带来的不便表示歉意。在这种情况下,我又添加了一个修改过的脚本。你能确认一下吗?在这种情况下,端点被更改并且不使用 blob。
    • 首先谢谢你,别担心!确实有效,我得到的日志与您在 Result 中显示的日志相同,并且在检查后,我的草稿收件箱中会出现一封新邮件。
    • @HCKRMVT 感谢您的回复。我很高兴你的问题得到了解决。也谢谢你。
    • 我添加到“EDIT(1)”消息中的新字段对您来说是否正确?我已经关注this 线程带来了这些修改,但最终它们没有出现在我的 gmail 草稿中。
    猜你喜欢
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2010-11-15
    • 2014-08-30
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多