2014-01-13 12 views
9

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.

Antwort

9

Nach dem Öffnen eines Problems mit Mailcore und ein bisschen Forschung habe ich die Antworten auf meine eigenen Fragen gefunden.

Erstens sind meine obigen Annahmen über UID, GmailMessageID und GmailThreadID korrekt. Die Verwirrung lag darin, dass ich die Google Mail-Konversationsansicht meines E-Mail-Kontos im Web betrachtete und davon ausging, dass mein Mailcore-Abruf mit diesem übereinstimmte. Dies geschieht nicht, weil die Konversationsansicht, wie der Name schon sagt, ALLE Nachrichten einer Konversation zusammenfügt, auch solche, die Antworten auf eine eingehende Nachricht im Posteingang waren - normalerweise würden solche Nachrichten in der "Gesendet" oder "Alle E-Mail" gefunden werden ' Mappe. Mit anderen Worten, was aus Mailcore abgerufen wird, erscheint unvollständig, nur weil es abruft, was AKTUELL in Ihrem Posteingang ist (oder in welchem ​​Ordner Sie Nachrichten abholen). Dies schließt KEINE Antworten auf eingehende Nachrichten ein. Um solche Nachrichten einzuschließen (zB um die Konversationsansicht von Google Mail neu zu erstellen), muss ich die gesendeten Nachrichten von 'Alle Nachrichten' abholen (oder ich schicke 'Nachrichten'), indem ich eine Suchoperation mit der gmailThreadID der Nachricht von Interesse.

Wenn ich die Konversationsansicht während des Testens meiner Mailcore-Abrufvorgänge für mein Google Mail-Konto im Web auf "Aus" umschalte, werden die Tests viel übersichtlicher.

+0

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

+0

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

+0

Danke für Ihre Kommentare. Können Sie mir Beispielcode geben? Es wird besser für mich. – iSara

0

Die Antwort gefunden, um gmailThreadID zu erhalten, müssen wir MCOIMAPMessagesRequestKindGmailThreadID hinzufügen. in Fetch Anfrage wie im Beispiel unten.

MCOIMAPMessagesRequestKind requestKind = (MCOIMAPMessagesRequestKind) 
    (MCOIMAPMessagesRequestKindHeaders | MCOIMAPMessagesRequestKindStructure | 
    MCOIMAPMessagesRequestKindInternalDate | MCOIMAPMessagesRequestKindHeaderSubject | 
    MCOIMAPMessagesRequestKindFlags | MCOIMAPMessagesRequestKindGmailThreadID);