我有一个 iPad 应用程序,它允许用户使用 Mailcore2 访问他们的 Gmail 帐户。我以为我了解了 Gmail 的线程 ID、邮件 ID 和 UID 之间的区别,直到我仔细查看了执行邮件获取操作时 Mailcore2 返回给我的内容。我希望有人能澄清我的困惑。
以下是我从 Gmail 文档中了解到的信息:
1) 线程 ID 将属于同一对话的消息(具有自己的消息 ID 和 UID)组合在一起
2) UID 是特定于消息的,并且仅对包含它的文件夹是唯一的
3) 消息 ID 特定于消息,并且在帐户的所有文件夹中是唯一的
我也在做以下假设:
1)一个线程有一个线程ID,是一个消息的集合。线程没有消息 ID 或 UID。
2)一条消息有一个消息ID、UID和线程ID(即使它是一个线程中唯一的消息)
3) 通过 UID 获取消息会获取 MESSAGES,其 UID 落在所请求的 UID 范围内。
4) 属于同一线程的消息会有不同的 UID 和消息 ID,但线程 ID 相同。
好的,所以假设上述内容是正确的,我认为在通过 UID 在 Mailcore2 中获取消息的典型过程中,我会收到一组电子邮件,并且从这些电子邮件中我可以查看它们的线程 ID,例如并重建线程在客户端。但是,我似乎收到了线程而不是电子邮件。此外,我得到的每个线程不一定包含其所有“子”消息。
例如,如果我的收件箱中有两个线程,每个线程包含五封邮件,Mailcore 会以 MCOIMAPMessages 的形式向我返回一个包含 2 个“电子邮件”的数组。并且每个“电子邮件”都有一个线程 ID、一个消息 ID 和一个 UID。所以我不确定如何访问这两个线程上包含的电子邮件。我看到有一个引用数组......但是检查这个对象并没有发现任何有用的东西。当我记录每个线程的内容时,我只得到部分内容——比如线程上 5 条消息中的 4 条。由于我不完全了解这一切是如何工作的,因此不确定这是 Mailcore 还是我的保存过程中的错误。
这是我获取消息的代码:
//创建获取操作以获取文件夹中的前(10)条消息(第一次获取通过序列号完成,后续获取通过UID完成
uint64_t location = MAX([info messageCount] - DefaultPageSize + 1, 1);
uint64_t size = serverMessageCount < DefaultPageSize ? serverMessageCount - 1 : DefaultPageSize - 1;
MCOIndexSet *numbers = [MCOIndexSet indexSetWithRange:MCORangeMake(location, size)];
MCOIMAPMessagesRequestKind kind = MCOIMAPMessagesRequestKindUid |
MCOIMAPMessagesRequestKindFullHeaders |
MCOIMAPMessagesRequestKindFlags |
MCOIMAPMessagesRequestKindHeaders |
MCOIMAPMessagesRequestKindInternalDate;
if ([capabilities containsIndex:MCOIMAPCapabilityGmail]) {
kind |= MCOIMAPMessagesRequestKindGmailLabels | MCOIMAPMessagesRequestKindGmailThreadID | MCOIMAPMessagesRequestKindGmailMessageID;
self.gmailCapability = YES;
}
fetchLatestEmails ([self.imapSession fetchMessagesByNumberOperationWithFolder:folder.folderId requestKind:kind numbers:numbers]);
//执行抓取
void (^fetchLatestEmails)(MCOIMAPFetchMessagesOperation *) = ^(MCOIMAPFetchMessagesOperation *fetchOperation) {
[fetchOperation start:^(NSError *error, NSArray *emails, MCOIndexSet *vanishedMessages) {
if (nil != error) {
failure(error);
NSLog(@"the fetch error is %@", error);
return;
}
[self.dataManager performBatchedChanges:^{
if ([emails count] !=0) {
MCOIndexSet *savedThreadIds = [[MCOIndexSet alloc]init];
for (MCOIMAPMessage *email in emails) {
//do stuff with emails
Thread *thread = [self.dataManager fetchOrInsertNewThreadForFolder:folder threadId:email.gmailThreadID ?: email.gmailMessageID ?: email.uid error:nil];
if (nil != thread) {
[savedThreadIds addIndex:thread.threadId];
[self.dataManager updateOrInsertNewEmailForThread:thread uid:email.uid messageId:email.gmailMessageID date:email.header.receivedDate subject:email.header.subject from:email.header.from.mailbox to:[email.header.to valueForKey:@"mailbox"] cc:[email.header.cc valueForKey:@"mailbox"] labels:labels flags:flags error:nil];
}
if (nil != error) {
failure(error);
return;
}
}
[savedThreadIds enumerateIndexes:^(uint64_t threadId) {
[self.dataManager updateFlagsForThreadWithThreadId:threadId inFolder:folder];
}];
}
NSError *folderUpdateError;
[self.dataManager updateFolder:folder withMessageCount:serverMessageCount error:&folderUpdateError];
} error:&error];
if (nil == error) {
[self refreshFolder:folder success:^{
success();
}failure:^(NSError *error) {
}];
} else {
failure(error);
}
}];
};
显然,就我对 Gmail 或 Mailcore2 的理解而言,这里有些不对劲。如果有人能指出我的误解,我将不胜感激。