ユーザーが Mailcore2 を使用して Gmail アカウントにアクセスできるようにする iPad アプリケーションがあります。メッセージのフェッチ操作を実行したときに Mailcore2 が返す内容を詳しく調べるまで、Gmail のスレッド ID、メッセージ ID、および UID の違いを理解していると思っていました。誰かが私の混乱を明確にしてくれることを願っています。
Gmailのドキュメントから私が知っていると思うことは次のとおりです。
1) スレッド ID は、同じ会話の一部であるメッセージ (独自のメッセージ ID と UID を持つ) をグループ化します。
2) UID はメッセージに固有であり、それを含むフォルダーにのみ固有です。
3) メッセージ ID はメッセージに固有であり、アカウントのすべてのフォルダーで一意です。
また、次の仮定を立てています。
1) スレッドはスレッド ID を持ち、メッセージの集まりです。スレッドにはメッセージ ID または UID がありません。
2) メッセージには、メッセージ ID、UID、およびスレッド ID があります (スレッド内の唯一のメッセージであっても)。
3) UID によるメッセージのフェッチは、要求された UID の範囲に入る UID を持つ MESSAGES をフェッチします。
4) 同じスレッドに属するメッセージの UID とメッセージ ID は異なりますが、スレッド ID は同じです。
わかりました。上記が正しいと仮定すると、Mailcore2 での UID によるメッセージの典型的なフェッチ中に、メールの配列を受け取り、それらのメールからスレッド ID を見て、たとえばスレッドを再構築できると思います。クライアント側で。ただし、メールではなくスレッドを返すようです。さらに、取得した各スレッドには、必ずしもすべての「子」メッセージが含まれているとは限りません。
たとえば、受信トレイに 2 つのスレッドがあり、それぞれに 5 つのメッセージが含まれている場合、Mailcore は 2 つの「メール」の配列を MCOIMAPMessages の形式で返します。また、各「メール」には、1 つのスレッド ID、1 つのメッセージ ID、および 1 つの UID があります。そのため、これら 2 つのスレッドに含まれるメールにアクセスする方法がわかりません。参照配列があることがわかりました...しかし、このオブジェクトを調べても、有用なものは何も明らかになりません。各スレッドの内容をログに記録すると、内容の一部 (スレッド上の 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 についての私の理解では、明らかに何かが間違っています。誰かが私の誤解を指摘できれば幸いです。