Gmail 添加 SENT 或 DRAFT 标签

Gmail add SENT or DRAFT label

我有一个使用 Gmail 的 "archive" 功能获得的 mbox 文件。其中的每封邮件都有一个 "X-Gmail-Labels" header 列表,其中 labels/folders 它进入。当我将 mbox 文件中的邮件导入新的 Gmail 帐户时(通过在 Thunderbird 中打开文件并复制邮件结束),新 Gmail 帐户中的邮件副本仍然具有 X-Gmail-Labels header,但它没有任何作用 - 邮件实际上没有标记任何标签。所以我写了一个脚本来使用 Gmail API 来获取每封邮件,阅读它的 X-Gmail-Labels,并将这些标签添加到邮件中。这主要是有效的,除了两个标签(SENT 和 DRAFT),我收到一个错误,说它是一个无效的标签。这些标签 ID 确实存在。如何将它们添加到消息中?

这是我提出的请求:

curl -H "Authorization: Bearer OAUTH_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"addLabelIds": ["SENT"]}' \
https://www.googleapis.com/gmail/v1/users/me/messages/MESSAGE_ID/modify

这是回复 body:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "invalidArgument",
    "message": "Invalid label: SENT"
   }
  ],
  "code": 400,
  "message": "Invalid label: SENT"
 }
}

(注意:我的实际脚本在 Python 中,但在 curl 中更容易看到发生了什么。)

SENT- 和 DRAFT- 标签的特殊之处在于它们一旦创建就无法添加到消息中。有关每个标签的更多信息,请参见 this guide.

相反,您可以 insert your messages 并立即给他们正确的标签。

这是一个示例,只是在开发者控制台中对示例消息进行了编码:

一条消息已发送

var encodedMessage = btoa([
  'From: example@gmail.com', '\r\n',
  'To: example@gmail.com', '\r\n',
  'Subject: cool subject', '\r\n', 
  '\r\n',
  'this is my sent message'
].join('')) 

请求

POST https://www.googleapis.com/gmail/v1/users/me/messages?access_token={YOUR_API_KEY}
{
 "raw": "RnJvbTogZW10aG9saW5AZ21haWwuY29tDQpUbzogZW10aG9saW5AZ21haWwuY29tDQpTdWJqZWN0OiBjb29sIHN1YmplY3QNCg0KdGhpcyBpcyBteSBzZW50IG1lc3NhZ2U=",
 "labelIds": [
  "SENT"
 ]
}

回应

{
 "id": "1525643b0785e7d7",
 "threadId": "1525643b0785e7d7",
 "labelIds": [
  "SENT"
 ]
}

一稿

请求

POST https://www.googleapis.com/gmail/v1/users/me/messages?access_token={YOUR_API_KEY}
{
 "raw": "RnJvbTogZW10aG9saW5AZ21haWwuY29tDQpUbzogZW10aG9saW5AZ21haWwuY29tDQpTdWJqZWN0OiBjb29sIHN1YmplY3QNCg0KdGhpcyBpcyBteSBzZW50IG1lc3NhZ2U=",
 "labelIds": [
  "DRAFT"
 ]
}

回应

{
 "id": "1525644c9553906d",
 "threadId": "1525644c9553906d",
 "labelIds": [
  "DRAFT"
 ]
}

此外,如果您希望创建的时间与插入消息中的 Date-header 相同,请确保传递值为 [=] 的查询参数 internalDateSource 19=].