我正在尝试通过其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)
答案 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标签,ArchiveScope
或https://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不同,但是此请求不会返回响应。