【问题标题】:Gmail API Users.messages: listGmail API Users.messages:列表
【发布时间】:2014-10-18 12:54:02
【问题描述】:

我正在开发电子邮件平台(使用 Objective-C 语言)并希望使用 GTMHTTPFetcher 和 GTMOAuth2Authentication 框架获取一些邮件。我正在使用 gmail API 来获取用户信息并获得适当的响应。

我想为用户的收件箱提取电子邮件,其中包含类别;我正在考虑使用 SYSTEM 级别标签,例如 CATEGORY_SOCIAL 用于社交,CATEGORY_PERSONAL 用于个人/主要等。

对于这个功能,我使用以下 GET API:https://www.googleapis.com/gmail/v1/users/userId/messages API 和适当的参数。我正在为此使用谷歌的试用选项。 https://developers.google.com/gmail/api/v1/reference/users/messages/list#try-it

问题:我能够获取所有 messageID/threadID,但无法在 google 开发者控制台中获取 labelID。我也从 Objective-C 代码中尝试过这种 GET 方法,但没有得到 labelID。

我已经附上了Objective-C代码的sn-p代码,你能帮我解决这个问题吗?

NSString *newAPIStr = @"";

newAPIStr = [NSString stringWithFormat:@"https://www.googleapis.com/gmail/v1/users/%@/messages?fields=messages(id,labelIds,threadId),nextPageToken&maxResults=%d",emailStr,maxResult];


NSURL *url = [NSURL URLWithString:newAPIStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPMethod:@"GET"];

GTMOAuth2Authentication *currentAuth = [GTMOAuth2ViewControllerTouch authForGoogleFromKeychainForName:kKeychainItemName clientID:kMyClientID clientSecret:kMyClientSecret];
GTMHTTPFetcher* myFetcher = [GTMHTTPFetcher fetcherWithRequest:request];
[myFetcher setAuthorizer:currentAuth];
[myFetcher beginFetchWithCompletionHandler:^(NSData *retrievedData, NSError *error) {
    if (error != nil) {
        // status code or network error
    } else {
        // succeeded
        NSDictionary* json = [NSJSONSerialization JSONObjectWithData:retrievedData options:kNilOptions error:&error];
        NSArray* messageArray =[json objectForKey:@"messages"];
        NSString *nextPageToken = [json objectForKey:@"nextPageToken"];
        for (NSDictionary *dictionary in messageArray) {
            [[EmailService instance].primaryMessages addObject:[dictionary objectForKey:@"id"]];
        }

        NSMutableArray *pArray = [[EmailService instance] primaryMessages];
        [[NSUserDefaults standardUserDefaults] setObject:pArray forKey: ALL_FUNNL];
        [[NSUserDefaults standardUserDefaults] setObject:nextPageToken forKey:@"PRIMARY_PAGE_TOKEN"];
        [[NSUserDefaults standardUserDefaults] synchronize];

        if([EmailService instance].primaryMessages.count < 5000)
            [self getPrimaryMessages:emailStr nextPageToken:nextPageToken numberOfMaxResult:100];
        else
            NSLog(@"----- Primary messages count > %d",pArray.count);
    }
}];}

得到如下输出:

{ "messages": [ { "id": "146da54fe3dc089e", "threadId": "146da54fe3dc089e" }, { "id": "146da41d9486982f", "threadId": "146da41d9486982f" }, ... }

【问题讨论】:

  • 您从 GET 调用中得到什么响应?
  • @kroikie:我已经在问题中添加了回复。

标签: email gmail-api


【解决方案1】:

message.list() 只返回消息的 id,这是相当标准的 REST 行为以保持响应小而快。如果您还需要获取有关消息(例如标签)的更多信息,则需要使用诸如 message.get(id=$THAT_ID, format=MINIMAL) 之类的信息进行跟进,您可以使用批处理调用它来检索许多信息并行消息。

【讨论】:

  • 能否详细说明一下?
  • 我仍然认为 Googles APIs Explorer 能够为 Users.messages:list 输入 fields 值而这些未在响应中返回或甚至没有某些字段值无效的错误。
  • @Kapé 比这更糟糕的是,在文档页面本身上,它允许您选择不是 id 或 labelId 的其他字段,就像您可以在下面的链接中看到的那样,但是如果您走那条路。它不会抛出错误或给你任何反馈,可能会指导你 get() 或其他东西。 developers.google.com/apis-explorer/#p/gmail/v1/…
【解决方案2】:

我相信你应该反过来做。获取标签列表并为每个标签获取消息。

INBOX 本身是一个标签,可让您获取主要电子邮件(“主要”选项卡中的电子邮件)

在此处获取标签列表:https://developers.google.com/gmail/api/v1/reference/users/labels/list

获取消息时提供 labelId(s)。

CATEGORY_UPDATES、INBOX、CATEGORY_PROMOTIONS 本身也是 ID 和名称。

我希望这有助于满足您的要求。

【讨论】:

    【解决方案3】:

    得到响应后

    {
     "messages": [
      {
       "id": "146da54fe3dc089e",
       "threadId": "146da54fe3dc089e"
      },
      {
       "id": "146da41d9486982f",
       "threadId": "146da41d9486982f"
      },
      ...
    }
    

    您可以使用以下方法从每个使用 id 的邮件中获取 标签 ID

    https://www.googleapis.com/gmail/v1/users/<userId>/messages/<messageId>
    

    参考:Users.messages: get

    【讨论】:

    • Gmail API 的文档并没有说虽然这可行,但我认为 messages.list 有一个错误,因为它没有带来其他字段。在文档本身上,它有一个“字段”属性,让您可以选择除 id 和 labelid 之外的其他字段。 developers.google.com/apis-explorer/#p/gmail/v1/…
    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 2016-07-08
    • 2019-12-18
    • 2016-12-21
    • 2020-07-21
    • 2021-03-21
    • 1970-01-01
    • 2014-08-25
    相关资源
    最近更新 更多