首页 > 解决方案 > 仅使用 VSTO 和 C# 获取 Outlook 电子邮件中的最新回复文本

问题描述

我已经浏览了许多链接,但似乎没有一个有效。我的问题是,在使用 C# 和 VSTO 编写的 Outlook 加载项中,我希望将最新回复电子邮件的文本捕获到线程。

问题是 MailItem 对象上的所有属性(例如 Body、HTMLBody 等)都提供了电子邮件的整个文本,包括过去的回复。我希望以某种方式只获得最新的文本。考虑到电子邮件中的多种语言,我需要能够做到这一点。

这是我尝试过的

  1. 在 MailEditor 上使用书签 - Exchange 和 Outlook 似乎不再有 _MailOriginal 书签
  2. 不知何故试图推迟 MIME 属性 - 我不知道要选择哪些属性以及如何使用它们来解析最近的文本。

标签: c#outlookvstooutlook-addin

解决方案


Outlook 对象模型没有为此提供任何东西。您需要自己解析消息正文字符串。

此外,您可以遍历对话中的所有项目,并在最新/最近的项目中检测每个项目。通过删除旧项目,您可以获得最新的。以下示例显示了如何在对话中获取和显示邮件项目。

    void DemoConversation()
    {
       object selectedItem = Application.ActiveExplorer().Selection[1];
       // For this example, you will work only with 
       //MailItem. Other item types such as
       //MeetingItem and PostItem can participate 
       //in Conversation.
       if (selectedItem is Outlook.MailItem)
       {
          // Cast selectedItem to MailItem.
          Outlook.MailItem mailItem = selectedItem as Outlook.MailItem; 
          // Determine store of mailItem.
          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 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 Conversation.
                Outlook.SimpleItems simpleItems = conv.GetRootItems();
                foreach (object item in simpleItems)
                {
                    // In this example, enumerate only MailItem type.
                    // Other types such as PostItem or MeetingItem
                    // can appear in 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, enumerate only MailItem type.
            // Other types such as PostItem or MeetingItem
            // can appear in 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);
          }
       }
    }

在示例代码示例中,我们获取一个选定的MailItem对象,然后MailItem通过该对象的Store属性确定该对象的存储Folder。DemoConversation 然后检查该IsConversationEnabled属性是否为真;如果为真,则代码示例Conversation通过使用GetConversation方法获取对象。如果Conversation对象不是空引用,则示例通过使用该方法获取Table包含对话中每个项目的关联对象。GetTable该示例然后枚举 中的每个项目Table并调用EnumerateConversation每个项目以访问每个项目的子节点。EnumerateConversation获取一个Conversation对象并使用GetChildren(Object)方法获取子节点。EnumerateConversation递归调用,直到没有更多的子节点。然后将每个对话项目显示给用户。


推荐阅读