【问题标题】:Insufficient Permission to modify Gmail labels with via API通过 API 修改 Gmail 标签的权限不足
【发布时间】:2019-08-16 02:44:34
【问题描述】:

我正在尝试通过他们的 API 修改 GMail 收件箱。

但我得到了错误:

请求时出现 HttpError 403 https://www.googleapis.com/gmail/v1/users/me/labels/SOME_MESSAGE_ID 返回“权限不足”

我已使用相同的 OAuth 凭据下载我的消息。所以我知道这是有效的。

我检查标签范围是否可用。

我看不出我做错了什么。 The label doc doesn't help.

有什么可以解释的吗?

def archive(msg_id):
    creds = None
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', ArchiveScope)
            creds = flow.run_local_server()
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('gmail', 'v1', credentials=creds)

    msg_labels = {'removeLabelIds': ['INBOX'], 'addLabelIds': ['MyLabel']}

    service.users().labels().update(userId='me', id=msg_id, body=msg_labels).execute()

    print('Message ID: %s' % msg_id)

【问题讨论】:

  • 您提到您正在尝试修改 Gmail 标签,您是否添加了以下范围? (https://mail.google.com/https://www.googleapis.com/auth/gmail.modifyhttps://www.googleapis.com/auth/gmail.labels)。另外,this SO post 使用 C# 语言,如果建议的操作适用于您,您可以尝试一下吗?

标签: python python-3.x gmail gmail-api google-api-client


【解决方案1】:

您的代码有一些问题。首先,确保ArchiveScope 是一个包含应用程序所需范围的列表。要更新、创建或删除 GMail 标签,https://www.googleapis.com/auth/gmail.readonlyhttps://www.googleapis.com/auth/gmail.labels 就足够了,as documented here

您的代码表明您正在尝试删除“收件箱”标签,并添加一个名为“MyLabel”的新标签。 service.users().labels().update()所描述的方法只能用于更改GMail账户上已有标签的信息,不能创建或删除。最重要的是,“收件箱”标签是保留标签,无法删除 - 当发出删除此标签的有效请求时,服务器会收到“无效删除请求”,如下所示。

DELETE https://www.googleapis.com/gmail/v1/users/me/labels/INBOX

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

但是,个人邮件可以使用service.users().messages().modify(){'removeLabelIds': ['INBOX'], 'addLabelIds': ['MyLabel']} request body that you used before 删除“收件箱”标签。但是,这只会从指定消息中删除标签,而不是整个标签。

修改现有标签内容的完整文档可以在here 找到,但 id 参数应该等于您要编辑的标签的唯一 ID,并且正文有效负载应该是包含新标签的字典结构您想将标签更改为的名称:

lbl_id = "Label_XXXXXXXXXXXXXXX"
    msg_labels = {
      'name' : [‘newLabelName’]
    }
    service.users().labels().update(userId='me', id=lbl_id, body = msg_labels).execute() 
    print('Message ID: %s' % lbl_id)

为了创建标签,you can use service.users().labels().create(userId=’me’, body={‘name’ : ‘MyLabel’ }).execute() 函数与 update() 的作用域相同。由于尚未创建标签,因此不需要标签 ID。

删除标签是一样的,尽管service.users().labels().delete(userId=’me’).execute() 是在没有正文的情况下使用的。与 create()、the delete service does require the label ID 不同,但是此请求不会返回响应。

【讨论】:

    猜你喜欢
    • 2017-04-24
    • 2015-08-20
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多