【问题标题】:Get the MailItem specific to the reply in Outlook获取特定于 Outlook 中回复的 MailItem
【发布时间】:2014-08-28 01:32:40
【问题描述】:

我正在制作一个 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.Subject = "Testing Reply Email" 行中的 MailItem 实际上与回复电子邮件不对应,因此主题不会更改。

如何获取回复电子邮件的 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 应该会出现,但事实并非如此。

【问题讨论】:

  • 需要使用ConversationId/ConversationIndex来跟踪相关消息。这是什么版本的 Outlook?更高版本(>2010)为这类事情提供了非常简单的 API。
  • 是的!这是来自 Office 365 中的 Outlook。
  • 看看MailItem.GetConversation 从那里,你有整个Conversation API。
  • 那么,使用 Conversation API,我应该如何在回复事件触发后获取回复的 MailItem?
  • 那么您是在尝试获取回复电子邮件的 mailItem 还是在单击回复按钮后尝试发送自定义回复?

标签: vb.net outlook-addin mailitem


【解决方案1】:

获得回复电子邮件并非易事。多年来,我一直困扰 Outlook 产品团队,让他们在 MailItem 对象上包含一个 ReplyItem 属性,但他们没有听。

问题是用户可以回复选定的电子邮件或打开的电子邮件。您始终可以监视 Inspectors.NewInspector 并检查新电子邮件的空白 MailItem.EntryID 值并确保 MailItem.Recipients.Count > 0。然后您将知道这是回复,然后您必须获取 Explorer。选择或循环检查器(以查找打开的电子邮件窗口)。然后,您必须将所选/打开的电子邮件上的 ConversationID 与新的撰写电子邮件相匹配。

【讨论】:

  • 所以,使用Inspectors.NewInspector,当它在外部邮件窗口中打开时,我可以轻松获取它,但是当它位于选定的电子邮件窗口内部时,没有办法获取它前景?
  • 抱歉,您能改写一下吗?我不确定你是什么意思。我猜,但如果您指的是“活动”窗口,那么您可以通过 Application.ActiveInspector 引用它。
  • 例如,如果消息“弹出”,我可以获得邮件项,但如果它仍在 Outlook 主窗口内,而不是弹出,则不能。
  • 哦 - 对于“内联回复”,您需要从 Explorer.ActiveInlineResponse 属性中获取 MailItem:msdn.microsoft.com/en-us/library/office/…
  • 嘿,我继续尝试,但无法让它工作。在 Outlook 主窗口内做出回复时,它不会弹出第二个 msgbox。我对我的问题进行了编辑以反映这一点。
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 2012-12-05
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 2014-02-07
  • 2019-06-08
  • 1970-01-01
相关资源
最近更新 更多