Gmail API:"标签无效"尝试将消息标签设置为我创建的消息标签时

时间:2014-11-17 00:46:54

标签: python gmail-api

我通过典型的方法在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;无效的标签"错误。

非常感谢任何帮助!非常接近能够做我需要的这个项目!

3 个答案:

答案 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))