Ich habe eine iPad-Anwendung, mit der Benutzer über Mailcore2 auf ihre Gmail-Konten zugreifen können. Ich dachte, ich hätte Verständnis für den Unterschied zwischen der Thread-ID, der Nachrichten-ID und der UID von Google Mail, bis ich mir genau angesehen habe, was Mailcore2 an mich zurücksendet, wenn ich eine Nachrichtenabrufoperation durchführe. Ich hoffe, dass jemand meine Verwirrung klären kann. HierAbrufen von Gmail über Mailcore 2: Thread-ID vs. Nachrichten-ID im Vergleich zur UID
ist, was ich glaube, ich weiß von den Google Mail-docs:
1) Ein Thread-ID-Gruppen zusammen Meldungen (die ihre eigenen Nachrichten-IDs und UIDs haben), die Teil der gleichen Gespräch sind
2) eine UID ist auf eine Nachricht spezifischen und einzigartigen ist nur in den Ordner, die er enthält
3) eine Nachricht ID auf eine Nachricht ist spezifisch und ist einzigartig in allen Ordnern eines Kontos
Ich mache auch die folgenden Annahmen:
1) Ein Thread hat eine Thread-ID und ist eine Sammlung von Nachrichten. Ein Thread hat keine Nachrichten-ID oder eine UID.
2) Eine Nachricht hat eine Nachrichten-ID, UID und Thread-ID (auch wenn es sich um die einzige Nachricht in einem Thread)
3) Nachrichten Fetching durch UID MESSAGES abruft, die eine UID, die in der gewünschten fällt Bereich von UIDs.
4) Nachrichten, die zu demselben Thread gehören, haben unterschiedliche UIDs und Nachrichten-IDs, aber dieselbe Thread-ID.
Ok, also vorausgesetzt, dass das obige korrekt ist, würde ich denken, dass während eines typischen Abrufs von Nachrichten in Mailcore2 durch UID, würde ich eine Reihe von E-Mails erhalten, und von diesen E-Mails könnte ich ihre Thread-ID z Beispiel und rekonstruieren Threads auf der Client-Seite. Allerdings scheint ich lieber Threads als E-Mails zurück zu bekommen. Außerdem enthält nicht jeder Thread, den ich erhalte, alle seine "Kind" -Nachrichten.
Zum Beispiel, wenn ich zwei Threads in meinem Posteingang, von denen jeder fünf Nachrichten enthält, Mailcore gibt mir ein Array von 2 "E-Mails" in Form von MCOIMAPMessages. Und jede "E-Mail" hat eine Thread-ID, eine Nachrichten-ID und eine UID. Ich bin mir also nicht sicher, wie ich auf diese beiden Threads zugreifen kann. Ich sehe, dass es ein Referenz-Array gibt ... aber die Inspektion dieses Objekts zeigt nichts Nützliches. Wenn ich den Inhalt jedes Threads protokolliere, bekomme ich nur einen Teil des Inhalts - sagen wir 4 von 5 Nachrichten im Thread. Nicht sicher, ob dies Mailcore oder ein Fehler in meinem Speichervorgang ist, weil ich nicht vollständig verstanden habe, wie alles funktioniert.
Hier ist mein Code Nachrichten zu holen:
// erstellen Abrufoperation zuerst zu erhalten (10) Nachrichten im Ordner (zuerst durch Sequenznummer, nachfolgende Abrufe werden durchgeführt von 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]);
getan Abruf
// ausführen
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);
}
}];
};
holen klar, dass etwas nicht in Ordnung ist hier in Bezug auf mein Verständnis von entweder Gmail oder Mailcore2. Wenn jemand mein Mißverständnis hinweisen kann ich wou Ich würde es zu schätzen wissen.
Erzähl mir eine Idee über ich möchte alle Mail-Konversation in der E-Mail bekommen. Jetzt bekomme ich jede Konversation in einer separaten Mail. – iSara
Es ist eine Weile her, seit ich das getan habe, aber zu meiner Erinnerung werden Sie alle Nachrichten getrennt erhalten, dann müssen Sie auf Ihrer Seite zusammenkommen, welche Nachrichten immer die gleiche threadID haben, um eine Konversation neu zu erstellen. – jac300
Danke für Ihre Kommentare. Können Sie mir Beispielcode geben? Es wird besser für mich. – iSara