【问题标题】:Gmail add SENT or DRAFT labelGmail 添加 SENT 或 DRAFT 标签
【发布时间】:2016-04-24 00:41:52
【问题描述】:

我有一个使用 Gmail 的“存档”功能获得的 mbox 文件。其中的每封邮件都有一个“X-Gmail-Labels”标头,列出了它所在的标签/文件夹。当我将 mbox 文件中的邮件导入新的 Gmail 帐户时(通过在 Thunderbird 中打开文件并将邮件复制过来) ,新 Gmail 帐户中的邮件副本仍然具有 X-Gmail-Labels 标头,但它不执行任何操作 - 邮件实际上没有标记任何标签。所以我编写了一个脚本来使用 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

这是响应正文:

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

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

【问题讨论】:

标签: gmail gmail-api


【解决方案1】:

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,其值为dateHeader

【讨论】:

  • @EricDeFrez 酷。这张纸真的很方便!
  • 我已经确认这可行,谢谢!不过需要注意的是:通过 API 插入消息时,它会添加一个带有当前时间的新 Received 标头,因此您需要指定 internalDateSource=dateHeader,否则消息的显示时间(在 Gmail Web 界面中查看消息列表时)为每当你插入它。
  • @Avril 是正确的:) 将其添加到答案中。谢谢!
猜你喜欢
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 2017-12-21
  • 1970-01-01
相关资源
最近更新 更多