簡體   English   中英

僅使用 VSTO 和 C# 獲取 Outlook Email 中的最新回復文本

[英]Only get the latest reply text in an Outlook Email using VSTO and C#

我已經瀏覽了許多鏈接,但似乎沒有一個有效。 我的問題是,在使用 C# 和 VSTO 編寫的 Outlook 加載項中,我希望將最新回復 email 的文本捕獲到一個線程。

問題是 MailItem object 上的所有屬性(例如 Body、HTMLBody 等)都給出了 email 的整個文本,包括過去的回復。 我希望以某種方式只獲得最新的文本。 考慮到 email 中的多種語言,我需要能夠做到這一點。

這是我嘗試過的

  1. 在 MailEditor 上使用書簽 - 似乎沒有更多帶有交換和 Outlook 的 _MailOriginal 書簽
  2. 不知何故試圖推遲 MIME 屬性 - 我不知道要選擇哪些屬性以及如何使用它們來解析最近的文本。

Outlook object model 沒有為此提供任何東西。 您需要自己解析消息正文字符串。

此外,您可以遍歷對話中的所有項目,並在最新/最近的項目中檢測每個項目。 通過刪除舊項目,您可以獲得最新的。 以下示例顯示了如何在對話中獲取和顯示郵件項目。

    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 object,然后使用Folder object 的Store屬性確定MailItem object 的存儲。 DemoConversation 然后檢查IsConversationEnabled屬性是否為真; 如果為真,則代碼示例使用GetConversation方法獲取Conversation object。 如果Conversation object 不是 null 引用,則該示例使用GetTable方法獲取包含對話中每個項目的關聯Table object。 然后,該示例枚舉Table中的每個項目並在每個項目上調用EnumerateConversation以訪問每個項目的子節點。 EnumerateConversation采用Conversation object 並使用GetChildren(Object)方法獲取子節點。 遞歸調用EnumerateConversation直到沒有更多的子節點。 然后將每個對話項目顯示給用戶。

即使在理論上你也不能這樣做:想象一個用戶在消息的頂部輸入(例如“見下文”),然后在下面的消息正文中插入/刪除各個部分(我一直這樣做)。 如果字體顏色不同,你很幸運。

您可以嘗試將原始消息與新消息進行比較並找出差異,但這需要訪問原始消息。 您可以查看PR_IN_REPLY_TO_ID MAPI 屬性(DASL 名稱http://schemas.microsoft.com/mapi/proptag/0x1042001F )並嘗試在收件箱或已發送郵件文件夾中查找原始郵件。 請注意,在后一種情況下(已發送郵件文件夾),該屬性可能在緩存的消息中不可用,您需要搜索該文件夾的在線版本(在 OOM 中不能這樣做,您需要 C++ 中的擴展 MAPI 或Delphi 或任何語言的兌換)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM