【问题标题】:Gmail API: "Invalid Label" When Trying to Set Message Label to One That I CreatedGmail API:尝试将邮件标签设置为我创建的标签时出现“无效标签”
【发布时间】:2015-01-13 20:15:35
【问题描述】:

我通过典型方法在 Gmail 的网络界面中创建了一个标签“handler_gmail”。

当我尝试通过 Gmail API(Python 客户端库)为邮件设置该标签时,我收到响应 HttpError 400,返回“无效标签:handler_gmail”。

我确定标签存在(我已检查多次 - 没有错别字)。

我正在尝试这样设置:

gs.users().messages().modify(userId=username, id=m['id'], body={"addLabelIds": ['handler_gmail']}).execute()

我尝试将 "removeLabelIds": [] 键/值对添加到字典中(认为它可能是必需的),但得到了相同的“无效标签”错误。

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

【问题讨论】:

  • 您需要使用 ids 而不是名称。

标签: python gmail-api


【解决方案1】:

正如其他人所指出的,您必须使用标签 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()

【讨论】:

    【解决方案2】:

    我能够通过 print(gs.users().labels().list(userId=username).execute()) 列出系统和用户标签

    这表明我的标签的标签 ID 是别的东西(“Label_1”——名称是“handler_gmail”)。因此,我将创建一个支持方法,通过名称获取标签 ID,并使用 ID 将标签添加到消息(通过修改)。

    谢谢!

    【讨论】:

      【解决方案3】:

      我实现了一个解析器来将我的标签名称更改为 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
      

      现在我这样称呼标签 Creator:

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

      【讨论】:

        猜你喜欢
        • 2021-05-25
        • 2021-10-13
        • 2016-04-29
        • 1970-01-01
        • 2020-06-30
        • 2015-10-26
        • 2021-11-02
        • 2013-10-02
        • 1970-01-01
        相关资源
        最近更新 更多