С# Получить последний ответ в беседе Outlook

Как получить последний ответ в беседе Outlook? Например, следующий код:

Outlook.MailItem item = Items.GetLast();
MessageBox.Show(item.Body);

отобразит все письмо, а не только последний ответ.


person Damian-Teodor Beleș    schedule 15.06.2018    source источник
comment
Проверьте MailItem.GetConversation образец кода.   -  person kennyzx    schedule 15.06.2018
comment
Нет, это не поможет. Я тоже пробовал. До сих пор не получить последний ответ.   -  person Damian-Teodor Beleș    schedule 15.06.2018
comment
Это то, что я хотел: stackoverflow.com/questions/56145308/   -  person Damian-Teodor Beleș    schedule 26.09.2019
comment
Items.GetLast() в любом случае даст вам последний MailItem в коллекции. Почему вы ожидали, что это даст вам последний ответ.   -  person Shakti Prakash Singh    schedule 11.10.2019
comment
@ShaktiPrakashSingh Я ничего не ожидал, потому что раньше не работал с этим. Поэтому я и задал вопрос, лол.   -  person Damian-Teodor Beleș    schedule 11.10.2019


Ответы (1)


В следующем примере показано, как получать и отображать почтовые элементы в беседе.

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 вызывается рекурсивно до тех пор, пока не останется дочерних узлов. Затем каждый элемент беседы отображается пользователю.

person Eugene Astafiev    schedule 17.06.2018
comment
Это отображает только элементы беседы, поэтому, если у вас есть беседа с двумя комментариями, будет отображаться первый, а после этого второй элемент будет отображаться как: COMMENT NUMBER #2 _____ From: Someone Sent: Date To: Somebody Subject: RE: COMMENT NUMBER #1 This is the text from first comment. Мне не нужна вторая часть (это в основном первый комментарий). ). - person Damian-Teodor Beleș; 06.07.2018