权限不足,无法通过API修改Gmail标签

时间:2019-03-25 19:11:12

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

我正在尝试通过其API修改GMail收件箱。

但是我得到了错误:

  

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

我使用了相同的OAuth凭据下载邮件。所以我知道这是有效的。

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

enter image description here

我看不到我做错的其他任何事情。 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)

1 个答案:

答案 0 :(得分:1)

您的代码有些错误。首先,确保def LoadExcel(): wb = openpyxl.load_workbook('WB/book.xlsx') #print(wb) sheet = wb.get_sheet_by_name('Sheet1') #print(sheet) try: infile = open("text.txt", "r") line = infile.readline() for rowNum in range(1, sheet.max_row): print(rowNum) for colNum in range(1, 3): print(colNum) sheet.cell(row=rowNum, column=colNum).value = line.rstrip() except IOError: print("Error") sys.exit() wb.save('book1.xlsx') 是包含应用程序所需范围的列表。为了更新,创建或删除GMail标签,ArchiveScopehttps://www.googleapis.com/auth/gmail.readonly就足够了as documented here

您的代码建议您尝试删除“ INBOX”标签,并添加一个名为“ MyLabel”的新标签。 https://www.googleapis.com/auth/gmail.labels描述的方法只能用于更改GMail帐户上现有标签的信息,而不能创建或删除。最重要的是,“收件箱”标签是保留标签,不能删除-当发出有效请求以删除该标签时,服务器将收到“无效的删除请求”,如下所示。

service.users().labels().update()

不过,单个邮件可以使用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() request body that you used before删除“收件箱”标签。这只会从指定的邮件中删除标签,但是不会完全删除标签。

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

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

为了创建标签,请使用you can use 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) 函数,其作用域与update()相同。由于尚未创建标签,因此不需要标签ID。

尽管service.users().labels().create(userId=’me’, body={‘name’ : ‘MyLabel’ }).execute()不用正文,但删除标签的方法是相同的。与create()the delete service does require the label ID不同,但是此请求不会返回响应。