【问题标题】:Calling conversation cleanup from outlook add-in从 Outlook 加载项调用对话清理
【发布时间】:2017-03-17 05:13:11
【问题描述】:

我需要从我的 Outlook 插件 (c# + vsto) 调用 Outlook 的对话清理。 我在办公室功能区栏上有我的按钮,单击它需要在当前选定的邮件项目上调用 Outlook 的对话清理。 这可能吗?如何去做?

【问题讨论】:

    标签: c# vsto outlook-addin


    【解决方案1】:

    Outlook 项目提供了GetConversation 方法,该方法获取一个Conversation 对象,该对象表示该项目所属的对话。

    GetConversation 返回Null(在 Visual Basic 中为无),如果不存在该项目的对话。在以下情况下不存在与项目的对话:

    •该项目尚未保存。可以通过编程、用户操作或自动保存来保存项目。

    •对于可以发送的项目(例如,邮件项目、约会项目或联系人项目),该项目尚未发送。

    •已通过 Windows 注册表禁用对话。

    •商店不支持对话视图(例如,Outlook 以经典在线模式运行,针对早于 Microsoft Exchange Server 2010 的 Microsoft Exchange 版本)。使用 Store 对象的 IsConversationEnabled 属性来确定商店是否支持对话视图。

    以下代码示例假定资源管理器窗口中的选定项目是邮件项目。该代码示例获取与所选邮件项关联的对话,并枚举该对话中的每个项目,显示项目的主题。 DemoConversation 方法调用所选邮件项的GetConversation 方法来获取关联的Conversation 对象。 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); 
                } 
             } 
          } 
    

    【讨论】:

    • 尤金,感谢您回复我的问题。为了使用上述方法,我们必须将每个消息正文与表中存在的所有其他消息的正文进行比较。除此之外,我发现 Outlook 有针对不同情况的正文(在某些邮件正文中,有 'mailto:' 并且电子邮件地址被 '[' 括号包围,而它在其他地方使用 '
    猜你喜欢
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    相关资源
    最近更新 更多