【问题标题】:VSTO Outlook Add-In - Handler to Sent Items not always workVSTO Outlook 加载项 - 发送项目的处理程序并不总是有效
【发布时间】:2017-04-17 01:22:57
【问题描述】:

我有一个 Outlook 插件,可以处理某种类型的已发送电子邮件。对于某些类型的电子邮件,用户必须填写一些信息的表格,然后应用程序将电子邮件作为 MSG 导出到文件系统中的目录树

我有一个带有按钮的功能区,该按钮为已发送的电子邮件设置标志(用户属性),以便插件知道必须保存哪封电子邮件:

Private Sub Button1_Click(sender As Object, e As RibbonControlEventArgs) Handles Button1.Click
    Dim oProperties As Outlook.UserProperties
    Dim oProperty As Outlook.UserProperty


    oMail = Globals.ThisAddIn.Application.ActiveInspector.CurrentItem


    If Not oMail Is Nothing Then

        oProperties = oMail.UserProperties
        oProperty = oProperties.Add("SALVARAPIGES", Microsoft.Office.Interop.Outlook.OlUserPropertyType.olYesNo)
        oProperty.Value = True
        oMail.Save()
        oMail.Send()
    Else
        MsgBox("Err")
        Exit Sub
    End If
End Sub

在插件启动中,我有(sn-p):

Private Sub ThisAddIn_Startup() Handles Me.Startup
    Dim sentItems As Outlook.Items
    Dim sentFolder As Outlook.Folder
    Dim paisapiges As String
    Dim aux As String()
    Dim ns As Microsoft.Office.Interop.Outlook.NameSpace

    apigesIsLoaded = True

    'adiciono um trigger para que sempre que for enviado um email e for do tipo SALVARAPIGES, ele fará o tratamento de salvar o email.
    sentFolder = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail)
    sentItems = sentFolder.Items
    AddHandler sentItems.ItemAdd, AddressOf itemadd

还有我的 itemadd 例程:

Sub itemadd(ByVal NewEmailItem As Object)
    Dim oProperties As Outlook.UserProperties
    Dim salvaApiges As Boolean
    Dim sentMessageItem As Outlook.MailItem = CType(NewEmailItem, Outlook.MailItem)
    Dim mainForm As New formSalvarApiges()

    salvaApiges = False
    If Not sentMessageItem Is Nothing Then
        oProperties = sentMessageItem.UserProperties
        For Each pr As Outlook.UserProperty In oProperties
            If pr.Name = "SALVARAPIGES" Then
                salvaApiges = True
                Exit For
            End If
        Next

        If salvaApiges Then
            mainForm.txtAssunto.Text = sentMessageItem.Subject
            mainForm.sAction = "Acao01"
            mainForm.sEntryId = sentMessageItem.EntryID
            mainForm.ShowDialog()
            mainForm.Close()
        End If
    End If
End Sub

您可以看到,只要电子邮件具有此“SALVARAPIGES”用户属性,就必须将其保存到目录树中的 MSG 中。但是一半的用户说这不起作用(表格没有弹出),但是每当我测试它时,它就起作用了。我对 VSTO 及其背后的所有概念都很陌生……谁能指出我的方向?

我尝试过使用 NameSpace.SendAndReceive 方法,但他们一直在抱怨。

提前致谢!

【问题讨论】:

    标签: vb.net vsto outlook-addin


    【解决方案1】:

    引发事件的对象 (sentItems) 被声明为局部变量。一旦 GC 启动,它就会被释放并且不会引发更多事件。在类级别声明变量以确保它保持活动状态。

    【讨论】:

      【解决方案2】:

      你需要在类级别声明源对象,以防止它被垃圾收集器刷掉:

      Dim sentItems As Outlook.Items
      
      Private Sub ThisAddIn_Startup() Handles Me.Startup
       Dim sentFolder As Outlook.Folder
       Dim paisapiges As String
       Dim aux As String()
       Dim ns As Microsoft.Office.Interop.Outlook.NameSpace
      
       apigesIsLoaded = True
      
       'adiciono um trigger para que sempre que for enviado um email e for do tipo SALVARAPIGES, ele fará o tratamento de salvar o email.
       sentFolder = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderSentMail)
       sentItems = sentFolder.Items
       AddHandler sentItems.ItemAdd, AddressOf itemadd 
      

      【讨论】:

      • 感谢您提供更完整的答案,但第一个答案仍然足以解决问题,所以我会给他功劳。不过非常感谢!
      猜你喜欢
      • 2022-08-09
      • 2021-10-24
      • 2017-11-04
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 2014-05-10
      相关资源
      最近更新 更多