我通过典型的方法在Gmail的网络界面中创建了一个标签" handler_gmail&#34 ;.
当我尝试通过Gmail API(Python客户端库)为邮件设置该标签时,我收到响应HttpError 400,返回"无效标签:handler_gmail"。
我确信标签存在(我已经多次检查过 - 没有拼写错误)。
我试图像这样设置它:
gs.users().messages().modify(userId=username, id=m['id'], body={"addLabelIds": ['handler_gmail']}).execute()
我尝试在词典中添加一个"removeLabelIds": []
键/值对(想想可能是必需的),但得到了相同的#34;无效的标签"错误。
非常感谢任何帮助!非常接近能够做我需要的这个项目!
答案 0 :(得分:11)
正如其他人所指出的,你必须使用标签ID,而不是标签名称。我通过使用gmail API sample code解决了这个问题,并修改了它以打印除了名称之外的ID:
results = service.users().labels().list(userId='me').execute()
labels = results.get('labels', [])
if not labels:
print('No labels found.')
else:
print('Labels:')
for label in labels:
print(label['name']+ " "+label['id'])
因此,一旦获得相应的ID,您的代码应该类似于:
gs.users().messages().modify(userId=username, id=m['id'], body={"addLabelIds":
['Label_1']}).execute()
答案 1 :(得分:4)
我能够通过print列出系统和用户标签(gs.users()。labels()。list(userId = username).execute())
这表明我的标签的标签ID是别的(“Label_1” - 名称是“handler_gmail”)。所以我将创建一个支持方法,通过名称获取标签ID,并使用ID将标签添加到消息中(通过修改)。
谢谢!
答案 2 :(得分:1)
我实现了一个解析器来将我的标签名称更改为ID
def ModifyMessage(service, user_id, msg_id, msg_labels):
"""Modify the Labels on the given Message.
Args:
service: Authorized Gmail API service instance.
user_id: User's email address. The special value "me"
can be used to indicate the authenticated user.
msg_id: The id of the message required.
msg_labels: The change in labels.
Returns:
Modified message, containing updated labelIds, id and threadId.
"""
try:
message = service.users().messages().modify(userId=user_id, id=msg_id,
body=msg_labels).execute()
label_ids = message['labelIds']
print('Message ID: %s - With Label IDs %s' % (msg_id, label_ids))
return message
except errors.HttpError, error:
print( 'An error occurred(modify): %s' % error)
def GetLabelIds(service, labels_in):
result = []
results = service.users().labels().list(userId='me').execute()
labels = results.get('labels', [])
for label_in in labels_in:
for label in labels:
if label['name'] == label_in:
result.append(label['id'])
break
return result
现在我打电话给标签创作者:
def CreateMsgLabels(service):
"""Create object to update labels.
Returns:
A label update object.
"""
removeLabels = GetLabelIds(service, ['OLDLABEL'])
addLabels = GetLabelIds(service, ['NEWLABEL'])
return {'removeLabelIds': removeLabels, 'addLabelIds': addLabels}
我在主代码中的调用看起来像这样
ModifyMessage(service, 'me', id, CreateMsgLabels(service))