Gmail API 用户消息:列表

8
我正在开发一个基于Objective-C语言的电子邮件平台,并希望使用GTMHTTPFetcher和GTMOAuth2Authentication框架来获取一些邮件。我使用gmail API获取用户信息并获得适当的响应。
我想要获取用户收件箱中带有类别的电子邮件;我考虑使用系统级标签,例如CATEGORY_SOCIAL用于社交、CATEGORY_PERSONAL用于个人/主要等。
为此功能,我使用以下GET API:https://www.googleapis.com/gmail/v1/users/userId/messages API,并使用正确的参数。我在google的“试用”选项中使用了这个API。 https://developers.google.com/gmail/api/v1/reference/users/messages/list#try-it 问题:我能够获取所有的messageIDs/threadIDs,但无法在google开发者控制台中获取labelIDs。我也尝试了从Objective-C代码中使用这个GET方法,但没有获取到labelIDs。
我附上了Objective-C代码片段,请帮我解决这个问题。
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" }, ... }

该输出显示了一个包含消息ID和线程ID的JSON数组。

你从 GET 调用中得到了什么响应? - Arthur Thompson
@kroikie:我已经在问题中添加了回复。 - Krunal
3个回答

4

message.list()仅返回消息的ID,这是保持响应小而快速的标准REST行为。如果您还需要获取有关消息的更多信息(例如标签),则需要使用类似message.get(id=$THAT_ID, format=MINIMAL)的后续操作,可以使用批处理并行检索许多消息。


请问您能否详细说明一下? - Krunal
11
我仍认为谷歌的API资源浏览器很烦人,因为在输入“fields”值时,对于“Users.messages:list”而言,并没有在响应中返回这些值,甚至没有错误提示表明某些字段值无效。 - Kapé
@Kapé 更糟糕的是,在文档页面本身上,它让您选择其他不是id或labelId的字段,就像您可以在下面的链接中看到的那样,但如果您走这条路,它将给您一个空响应。它不会抛出错误或给您任何反馈,也许指导您使用get()或其他方法。 https://developers.google.com/apis-explorer/#p/gmail/v1/gmail.users.messages.list - Murilo

1
我认为你应该反过来做。先获取标签列表,然后针对每个标签获取消息。
INBOX本身就是一个标签,它可以让你获取主要的电子邮件(即“主要”选项卡中的电子邮件)。
在这里获取标签列表:https://developers.google.com/gmail/api/v1/reference/users/labels/list 获取邮件时,请提供labelId(s)。
此外,CATEGORY_UPDATES、INBOX和CATEGORY_PROMOTIONS本身都是id,也是名称。
我希望这可以帮助您处理您的需求。

0

在收到响应后

{
 "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存在一个bug,无法获取其他字段。在文档本身中,它有一个“field”属性,可以让您选择除id和labelid之外的其他字段。 https://developers.google.com/apis-explorer/#p/gmail/v1/gmail.users.messages.list - Murilo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接