2017-03-16 42 views
0

我需要從我的Outlook加載項(c#+ vsto)調用Outlook的對話清理。 我在辦公室的色帶欄上有我的按鈕,然後點擊它,它需要調用當前選定郵件項目的Outlook對話清理。 這是可能的,以及如何去做?從Outlook加載項調用對話清理

回答

0

Outlook項目提供了GetConversation方法,該方法獲取代表該項目所屬對話的Conversation對象。

GetConversation返回Null(在Visual Basic中爲Nothing)如果該對象不存在對話。在下列情況下沒有對象存在對話:

•該項目尚未保存。項目可以以編程方式保存,也可以通過用戶操作或自動保存保存。

•對於可發送的項目(例如,郵件項目,預約項目或聯繫人項目),該項目尚未發送。

•會話已通過Windows註冊表禁用。

•商店不支持「對話」視圖(例如,Outlook對比早於Microsoft Exchange Server 2010的Microsoft Exchange版本以經典聯機模式運行)。使用Store對象的IsConversationEnabled屬性來確定商店是否支持對話視圖。

以下代碼示例假定瀏覽器窗口中的選定項目是郵件項目。代碼示例獲取與選定郵件項目關聯的對話,並枚舉該對話中的每個項目,顯示該項目的主題。 DemoConversation方法調用所選郵件項目的GetConversation方法以獲取關聯的對話對象。 DemoConversation然後分別調用Conversation對象的GetTableGetRootItems方法分別獲取Table對象和SimpleItems集合。

void DemoConversation() 
{ 
    object selectedItem = 
    Application.ActiveExplorer().Selection[1]; 
    // This example uses only 
    // MailItem. Other item types such as 
    // MeetingItem and PostItem can participate 
    // in the conversation. 
    if (selectedItem is Outlook.MailItem) 
    { 
     // Cast selectedItem to MailItem. 
     Outlook.MailItem mailItem = 
      selectedItem as Outlook.MailItem; 
     // Determine the store of the mail item. 
     Outlook.Folder folder = mailItem.Parent as Outlook.Folder; 
     Outlook.Store store = folder.Store; 
     if (store.IsConversationEnabled == true) 
     { 
     // Obtain a Conversation object. 
     Outlook.Conversation conv = mailItem.GetConversation(); 
     // Check for null Conversation. 
     if (conv != null) 
     { 
      // Obtain Table that contains rows 
      // for each item in the conversation. 
      Outlook.Table table = conv.GetTable(); 
      Debug.WriteLine("Conversation Items Count: " + 
      table.GetRowCount().ToString()); 
      Debug.WriteLine("Conversation Items from Table:"); 
      while (!table.EndOfTable) 
      { 
       Outlook.Row nextRow = table.GetNextRow(); 
       Debug.WriteLine(nextRow["Subject"] 
       + " Modified: " 
       + nextRow["LastModificationTime"]); 
      } 
      Debug.WriteLine("Conversation Items from Root:"); 
      // Obtain root items and enumerate the conversation. 
      Outlook.SimpleItems simpleItems 
       = conv.GetRootItems(); 
      foreach (object item in simpleItems) 
      { 
       // In this example, only enumerate MailItem type. 
       // Other types such as PostItem or MeetingItem 
       // can appear in the conversation. 
       if (item is Outlook.MailItem) 
       { 
        Outlook.MailItem mail = item 
         as Outlook.MailItem; 
        Outlook.Folder inFolder = 
         mail.Parent as Outlook.Folder; 
        string msg = mail.Subject 
        + " in folder " + inFolder.Name; 
        Debug.WriteLine(msg); 
       } 
       // Call EnumerateConversation 
       // to access child nodes of root items. 
       EnumerateConversation(item, conv); 
       } 
      } 
     } 
    } 
    } 


    void EnumerateConversation(object item, 
     Outlook.Conversation conversation) 
    { 
     Outlook.SimpleItems items = 
      conversation.GetChildren(item); 
     if (items.Count > 0) 
     { 
      foreach (object myItem in items) 
      { 
       // In this example, only enumerate MailItem type. 
       // Other types such as PostItem or MeetingItem 
       // can appear in the conversation. 
       if (myItem is Outlook.MailItem) 
       { 
        Outlook.MailItem mailItem = 
        myItem as Outlook.MailItem; 
        Outlook.Folder inFolder = 
        mailItem.Parent as Outlook.Folder; 
        string msg = mailItem.Subject 
        + " in folder " + inFolder.Name; 
        Debug.WriteLine(msg); 
       } 
       // Continue recursion. 
       EnumerateConversation(myItem, conversation); 
      } 
     } 
     } 
+0

尤金,感謝您回覆我的問題。爲了使用上述方法,我們必須將每個消息體與表中所有其他消息的主體進行比較。除此之外,我發現Outlook有不同情況下的正文文本(在某些郵件正文中有'mailto:',而電子郵件地址被'['括號括起來,而其他地方使用'<'括號「,在某些地方秒數存在於時間字段)。因此,只調用Outlook的內置對話清除功能可能會更好,而不是重新發明輪子。 –