2017-03-16 12 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的内置对话清除功能可能会更好,而不是重新发明轮子。 –