Получите MailItem, относящийся к ответу в Outlook

Я создаю плагин для Outlook, которому необходимо изменить несколько свойств MailItem, когда пользователь нажимает «ответить» на любое электронное письмо. Сейчас я делаю что-то вроде этого:

Private Sub PrepareEmailForReply(ByVal MailItem As Outlook.MailItem, ByVal FromAddress As String)
    If Not ReplyDictionary.ContainsKey(MailItem.ConversationID) Then
        ReplyDictionary.Add(MailItem.ConversationID, FromAddress)
        AddHandler MailItem.Reply, Sub()
                                               InReply = True
                                   End Sub
    End If
End Sub

Private Sub CurrentExplorer_SelectionChange() Handles CurrentExplorer.SelectionChange
    Dim SelectedFolder As Outlook.MAPIFolder = Me.Application.ActiveExplorer().CurrentFolder
    Try
        If Me.Application.ActiveExplorer.Selection.Count > 0 Then
            Dim SelectedObject As Object = Me.Application.ActiveExplorer.Selection.Item(1)
            If (TypeOf SelectedObject Is Outlook.MailItem) Then
                Dim MailItem As Outlook.MailItem = TryCast(SelectedObject, Outlook.MailItem)

                If (CurrentEmail IsNot MailItem) Then
                    Output.AddInfo(MailItem.ConversationTopic)

                    CurrentEmail = MailItem
                    If (InReply) Then
                        Output.AddInfo("> In Reply")
                        If ReplyDictionary.ContainsKey(MailItem.ConversationID) Then
                            MailItem.Subject = "Testing Reply Email"
                        End If
                    Else
                        Output.AddInfo("> In MailItem")
                        For Each Recipient As Outlook.Recipient In MailItem.Recipients
                            Dim CurrentEmailAddress As String = Recipient.AddressEntry.GetExchangeUser().PrimarySmtpAddress.ToLower.Trim()
                            If ListeningUsers.Contains(CurrentEmailAddress) Then
                                PrepareEmailForReply(MailItem, CurrentEmailAddress)
                                Exit For
                            End If
                        Next
                    End If
                    InReply = False
                End If
                End If
        End If
    Catch ex As Exception
    End Try
End Sub

Все работает нормально, но MailItem в строке с надписью `MailItem.Subject =" Testing Reply Email "на самом деле не соответствует ответному электронному письму, поэтому тема не меняется.

Как мне получить MailItem для ответного электронного письма, чтобы я мог изменить его тему?

Переменная ListeningUsers - это List(of String), который содержит список того, для каких электронных писем это действует. Он содержит текущего пользователя.

**РЕДАКТИРОВАТЬ: **

Здесь я добавил несколько изменений в вызов события MailItem.Reply:

        AddHandler MailItem.Reply, Sub()
                                       Dim CurrentInspector As Outlook.Inspector = Globals.ThisAddIn.Application.ActiveInspector()
                                       Dim ReplyMailItem As Outlook.MailItem = TryCast(CurrentInspector.CurrentItem, Outlook.MailItem)
                                       If (ReplyMailItem IsNot Nothing) Then
                                           MsgBox("1: " & ReplyMailItem.Subject & " - " & ReplyMailItem.EntryID)
                                           Return
                                       End If

                                       CurrentInspector = CurrentExplorer.ActiveInlineResponse
                                       ReplyMailItem = TryCast(CurrentInspector.CurrentItem, Outlook.MailItem)
                                       If (ReplyMailItem IsNot Nothing) Then
                                           MsgBox("2: " & ReplyMailItem.Subject & " - " & ReplyMailItem.EntryID)
                                       End If
                                   End Sub

Первый msgbox появится, если я открою электронное письмо во внешнем окне, а затем нажму «Ответить», однако, если я нажму «Ответить на электронное письмо внутри Outlook (не во всплывающем окне), то должен появиться второй msgbox, но его нет.


person Freesnöw    schedule 07.07.2014    source источник
comment
Необходимо использовать _1 _ / _ 2_ для отслеживания связанных сообщений. Какая это версия Outlook? В более поздних версиях (›2010) есть очень простые API для такого рода вещей.   -  person Brad Christie    schedule 07.07.2014
comment
Ага! Это из Outlook в Office 365.   -  person Freesnöw    schedule 07.07.2014
comment
Взгляните на _1 _ Оттуда у вас есть весь Conversation API.   -  person Brad Christie    schedule 07.07.2014
comment
Итак, используя Conversation API, как мне получить MailItem ответа после срабатывания события ответа?   -  person Freesnöw    schedule 07.07.2014
comment
Итак, вы пытаетесь получить mailItem ответного электронного письма или пытаетесь отправить собственный ответ после нажатия кнопки ответа?   -  person Alex    schedule 08.07.2014
comment
Что ж, мне нужно просто изменить тему / сообщение / все, что мне нужно, чтобы изменить текущий ответ. Мне нужно нажать кнопку «Ответить», а затем изменить ответ. Я не думаю, что это действительно индивидуальный ответ, потому что мне нужно все то же самое - я просто хочу изменить ответное электронное письмо, как только оно будет сделано - я предполагаю, что мне нужно будет получить объект mailitem ответа, а затем изменить его, да ?   -  person Freesnöw    schedule 08.07.2014


Ответы (1)


Получить ответное электронное письмо - непростая задача. Я много лет приставал к команде разработчиков Outlook, чтобы включить свойство ReplyItem в объект MailItem, но они не слушали.

Проблема в том, что пользователь может ответить на выбранное письмо ИЛИ на открытое письмо. Вы всегда можете отслеживать Inspectors.NewInspector и проверять наличие пустого значения MailItem.EntryID для новых писем и гарантировать, что MailItem.Recipients.Count> 0. Тогда вы узнаете, что это ответ, и тогда вам нужно будет получить Explorer. Выбор ИЛИ прокрутите инспекторы (чтобы найти открытые окна электронной почты). Затем вам нужно будет сопоставить ConversationID в выбранном / открытом письме с новым составным письмом.

person Eric Legault    schedule 08.07.2014
comment
Итак, используя Inspectors.NewInspector, я смог легко получить, когда он был открыт во внешних окнах почты, но нет ли способа получить его, когда он находится внутри выбранного окна электронной почты, находящегося внутри Outlook? - person Freesnöw; 09.07.2014
comment
Извините, вы можете перефразировать это, пожалуйста? Я не уверен, что вы имеете в виду. Я предполагаю, но если вы имеете в виду активное окно, вы можете ссылаться на него через Application.ActiveInspector. - person Eric Legault; 09.07.2014
comment
Например, я мог бы получить почтовый элемент, если бы сообщение выскочило, но не, если бы оно все еще находилось внутри главного окна Outlook, а не выскакивало. - person Freesnöw; 09.07.2014
comment
О, для встроенных ответов вам нужно получить MailItem из свойства Explorer.ActiveInlineResponse: msdn.microsoft.com/en-us/library/office/ - person Eric Legault; 10.07.2014
comment
Эй, я пошел дальше и попробовал, но не смог заставить это работать. Второе msgbox не всплывает, если ответ сделан в главном окне Outlook. Я отредактировал свой вопрос, чтобы отразить это. - person Freesnöw; 10.07.2014
comment
Сначала вам нужно захватить событие MailItem.Reply для встроенного сообщения. Аргумент объекта Response для этого события предоставит объект MailItem для нового ответного сообщения. - person Eric Legault; 10.07.2014