E-Mail-Konversationen / E-Mail-Threading-Unterstützung in EWS Managed Api (gegen Exchange 2010 oder so)

8

Die EWS Managed API verfügt über eine Reihe von Funktionen zum Abrufen und Verwalten von E-Mail-Konversationen ( aka E-Mail-Threads ) ). Leider arbeitet ein großer Teil von ihnen nur gegen neue Versionen von Exchange (2013 usw.)

Outlook implementiert E-Mail-Threads für ältere Versionen von Exchange. Vielleicht geschieht dies, indem die Threads selbst verwaltet werden (Outlook ist eine Desktop -Anwendung, die E-Mails werden auf dem lokalen Rechner kopiert, daher können sie einfach nach Konversationsthema usw. gruppiert werden .).

Nun, wie kann das E-Mail-Threading innerhalb einer Webanwendung unterstützt werden? Was wird üblicherweise für die Unterstützung dieser Funktion in einem Exchange-Client getan? Mit unterstützt meine ich:

  • Abrufen der ersten 10 Konversations-Snapshots und Abrufen der nächsten 10 Konversations-Snapshots - dh Unterstützung für Paging (Abruf von Seiten bei Bedarf) - diese Daten werden zum Erstellen einer Master-Ansicht verwendet
  • ruft alle E-Mails in einer Konversation ab - ruft die untergeordneten Konversationen auf Anforderung ab ) - diese Daten werden verwendet, um eine Detailansicht einer Konversation zu erstellen .

Probleme mit EWS Managed Api etc .:

  • Es gibt keine Conversation.Bind (conversationId) in der EWS Managed API
  • ExchangeService.FindItems (Filter für ConversationTopic == "Irgendein Thema") ist keineswegs zuverlässig (weil es verschiedene Konversationen mit demselben Thema geben kann)
  • ExchangeService.FindItems (Filter für ConversationId == "QWERYUIO") - Ich konnte nicht herausfinden, wie man das verwendet :) Ist es möglich nach E-Mails nach ConversationId ?
  • Funktionen wie ExchangeService.GetConversationItems () sind nur "anwendbar für Clients, die auf Exchange Online und Exchange-Versionen ab Exchange Server 2013 abzielen."

Was ich jetzt verwende (als Workaround) :

  1. Abrufen (auf Anforderung) einer Seite mit Konversationen mithilfe von ExchangeService.FindConversation ()
  2. Lesen Sie für jede Konversation auf der abgerufenen Seite die Conversation.GlobalIds Eigenschaft
  3. Erstellen Sie ein Aggregat (ein Array), das die Werte aller GlobalIds enthält, indem Sie Conversation.GlobalIds aller Konversationen verketten
  4. Führen Sie einen Exchange-Aufruf durch, um die IDs an E-Mails zu binden ( ExchangeService.BindToItems )
  5. führt eine Gruppen-durch -Operation der E-Mails aus (konzeptionell handelt es sich um eine Gruppierungsoperation, aber die Implementierung ist keine triviale Gruppe-nach-Anruf - E-Mails können nicht nach ConversationId , da diese Eigenschaft bei der Arbeit mit Exchange 2010 nicht verfügbar ist, obwohl die Dokumentation dies nicht angibt)
  6. Verwenden Sie die Daten, um die Benutzeroberfläche in einem Schritt zu erstellen (die Liste der Konversationen für die Master-Ansicht , die Gruppen von E-Mails für die Detailansicht jeder Konversation) usw.

Einige Probleme mit der oben beschriebenen Implementierung

  • Ich rufe beim Aufruf der Operation ExchangeService.BindToItems viele Daten vom Server ab - die Leistung ist nicht hervorragend, aber auch nicht sehr schlecht. Natürlich wäre es besser gewesen, die E-Mails nur dann abzurufen, wenn der Benutzer auf die Detailansicht einer bestimmten Konversation zugreifen möchte. Ein möglicher Hack: Halten Sie das GlobalIds-Array irgendwo in einem versteckten Feld und verwenden Sie es dann, um die E-Mails abzurufen, um die Detailansicht zu erstellen. Ich weiß, dass eine GET-Anfrage in der Größe begrenzt ist, aber aber ...

Bei E-Mail-Konversationen / E-Mail-Threads weiß niemand, was was unterstützt:

  • Hier steht das FindConversation (ViewBase, FolderId) gilt für Clients, die auf Exchange Online und Exchange-Versionen ab Exchange Server 2013 abzielen . Auf der anderen Seite ist hier geschrieben, dass der Die Funktion ExchangeService.FindConversation () kann für Versionen von Exchange ab Exchange 2010 einschließlich Exchange Online verwendet werden.
  • Das ist auch lustig: Gilt zu: EWS Managed API | Exchange Server 2010 Service Pack 1 (SP1) , ABER Stellen Sie sicher, dass Sie über ein Exchange 2013- oder Exchange Online-Dienstkonto mit einer Hauptversion von 15 oder höher verfügen. :)
  • Hier heißt es, dass das Item.Die Eigenschaft "ConversationId" ist in Versionen von Exchange verfügbar, die mit Exchange 2010 beginnen, einschließlich Exchange Online. Aber es ist nicht:)

Hinweis: Ich bin nicht sehr sicher über die Unterstützung der Item.ConversationId, da ich den Code nicht zur Hand habe und momentan keinen Test durchführen kann. Bitte verzeihen Sie mir deshalb, wenn diese Eigenschaft überhaupt verfügbar ist, wenn Sie die EWS Managed API für Exchange 2010 verwenden.

Alles in allem Haben Sie Ideen zur Implementierung der E-Mail-Konversation / E-Mail-Threading-Funktion in einer Webanwendung mithilfe der EWS Managed API für einen Exchange 2010-Server?

Vielen Dank für die Geduld, einen so langen Beitrag zu lesen:)

Einige Referenzen:

Ссылка Ссылка Ссылка Ссылка

Implementieren der Outlook 2010-Gruppe nach Konversation mithilfe von EWS und Exchange 2007 Exchange Webservice Managed API - Suchen Sie Elemente nach erweiterten Eigenschaften

    
turdus-merula 26.04.2014, 23:13
quelle

2 Antworten

5

Ich habe einige der Dokumentationsfragen angesprochen, die Sie in den Kommentaren hatten, also werde ich versuchen, Ihre wirklichen Programmierfragen hier zu beantworten.

Um Ihre Masteransicht zu erhalten, ist ExchangeService.FindConversation die richtige Methode. Es unterstützt Paging, indem die Ergebnisse auf die Anzahl der Konversationen beschränkt werden, die vom Ansichtsparameter angegeben werden. Sie könnten es bei Bedarf anrufen, um ältere und ältere Ergebnisse zu erhalten.

Um Ihre Detailansicht anzuzeigen, da ExchangeService.GetConversationItems nicht in Ex2010 verfügbar ist, können Sie ExchangeService.FindItems mit einem IsEqualTo-Suchfilter verwenden, der nach Elementen mit einer übereinstimmenden ConversationId sucht (siehe nachfolgenden Code). Weitere Informationen zu Suchfiltern finden Sie hier: Vorgehensweise: Verwenden Sie Suchfilter mit EWS in Exchange .

In der folgenden Methode habe ich die Eigenschaften des FindItems-Aufrufs eingeschränkt, indem ich einen Eigenschaftensatz angegeben und nicht alle Eigenschaften zurückgegeben habe. Wenn Sie alle Eigenschaften zurückgeben möchten, entfernen Sie einfach die Zeile, die das PropertySet festlegt.

%Vor%

Sobald Sie jede ItemID (die vom obigen Code zurückgegeben wird) haben, können Sie die Bind-Methode verwenden, um alle Eigenschaften für jedes Element zu erhalten.

Ich hoffe, das hilft. Ich werde nachgehen, wenn die Versionierungsprobleme für die Methoden auf MSDN aktualisiert wurden.

    
Mimi Gentz 06.05.2014, 20:12
quelle
0

Allgemeiner scheint es ein Problem mit der ConversationID zu geben, wie es im Allgemeinen verstanden und tatsächlich in Exchange selbst verwendet wird. Dies könnte sich auf Ihre (oder irgendjemandes) Entwicklung auswirken.

Ich habe an einem E-Mail-Ticketing-Programm in der Produktion gearbeitet und verwendete ConversationID, um E-Mails in einem einzigen Thread zur einfachen Anzeige zusammenzufassen.

Aber jetzt scheint es, dass es E-Mails gibt, die nicht auf demselben Thread sind - ja, sie teilen das gleiche Subjekt und die Absenderadresse und werden um dasselbe Datum / dieselbe Zeit gesendet - aber sie kommen nicht in jedem Zitat vor andere (z. B. eine E-Mail-Stelle als Antwort auf eine ältere, wie viele einen "E-Mail-Thread" auslegen) - dennoch haben diese unterschiedlichen E-Mails die gleiche genaue ConversationID, obwohl ein Body nichts mit einem anderen zu tun hat.

Auch wenn das Datum / die Zeit nicht in der Nähe ist, z. B. eine "Gedanken des Tages" -Email von derselben Person, werden diese manchmal mit derselben ConversationID gruppiert. Dies mag sich in diesem Fall als nützlich erweisen, ist aber im Geschäftsfall einer Gehaltsgruppe, die "RE: 401k" sendet, nicht so nützlich.

Um klar zu sein, es handelt sich hierbei nicht um eine Groß- und Kleinschreibung, die ich bei der Verwendung von Item.ExchangeID zuvor übersehen hatte (was einzigartig ist, wenn Sie den Fall berücksichtigen). Selbst bei Berücksichtigung von Groß- und Kleinschreibung haben ganz unterschiedliche E-Mail-Threads dieselbe ConversationID.

Dies legt nahe, dass man sich nicht auf ConversationID als GROUP BY-Klausel verlassen kann und zusätzlichen, benutzerdefinierten Code verwenden muss.

    
John Linton 10.01.2017 19:55
quelle