在创建Outlook对象时,在部署系统上抛出未指定的错误



我有一个与Outlook集成的应用程序,只是为了发送带有附件的电子邮件(VB)。. NET v4).

因为我需要它在多个版本的Outlook上运行,所以我使用了延迟绑定。

在我的本地系统和另一个部署系统上,一切正常(Outlook 2016)。

在3个特定的系统上,我无法创建"Outlook。因为抛出了一个异常,不幸的是,错误没有告诉我任何信息。这只发生在Outlook正在运行时。(所有运行win10的系统)

我正在从网络共享中运行应用程序,但是我已经尝试从c: drive和documents目录在本地运行。还尝试以管理员身份运行。

我尝试过的另一件事是检查Outlook是否正在运行以获取对象,而不是创建对象,但如果Outlook正在运行则错误仍然存在。

这是我使用的:

Public Class Email
    Public Shared Sub EnviaEmail(ByVal pEnderecoDestino() As String, ByVal pAssunto As String, ByVal pBody As String, Optional ByVal pEnderecoCC() As String = Nothing, Optional ByVal pEnderecoBCC() As String = Nothing, Optional ByVal pAnexos() As String = Nothing)
        Dim objOutlook As Object
        Dim objMensagem As Object
        Dim objEnderecos As Object
        Dim objEndereco As Object
        Dim objAnexos As Object
        Try
            Dim fechaApp As Boolean = False
            If Process.GetProcessesByName("OUTLOOK") Is Nothing Then fechaApp = True
            objOutlook = CreateObject("Outlook.Application")          
            objMensagem = objOutlook.CreateItem(0)
            With objMensagem
                .Subject = pAssunto
                .BodyFormat = 1
                .Body = pBody
            End With
            objEnderecos = objMensagem.Recipients
            For i As Integer = 0 To pEnderecoDestino.Length - 1 Step 1
                If Not String.IsNullOrEmpty(pEnderecoDestino(i)) Then
                    objEndereco = objEnderecos.Add(pEnderecoDestino(i).Trim())
                    objEndereco.Type = 1
                    objEndereco.Resolve()
                End If
            Next i
            If Not pEnderecoBCC Is Nothing Then
                For i As Integer = 0 To pEnderecoBCC.Length - 1 Step 1
                    If Not String.IsNullOrEmpty(pEnderecoBCC(i)) Then
                        objEndereco = objEnderecos.Add(pEnderecoBCC(i).Trim())
                        objEndereco.Type = 3
                        objEndereco.Resolve()
                    End If
                Next i
            End If
            If pEnderecoCC IsNot Nothing Then
                For i As Integer = 0 To pEnderecoCC.Length - 1 Step 1
                    If Not String.IsNullOrEmpty(pEnderecoCC(i)) Then
                        objEndereco = objEnderecos.Add(pEnderecoCC(i).Trim())
                        objEndereco.Type = 2
                        objEndereco.Resolve()
                    End If
                Next i
            End If
            objAnexos = objMensagem.Attachments
            If pAnexos IsNot Nothing Then
                For i As Integer = 0 To pAnexos.Length - 1 Step 1
                    objAnexos.Add(pAnexos(i))
                Next i
            End If

            objMensagem.Send()

            If fechaApp Then objOutlook.Quit()
        Catch ex As COMException
            Select Case ex.ErrorCode
                Case -2147467260
                    Throw New Exception("Permission denied to access MS Outlook", ex.InnerException)
                Case -2147221164
                    Throw New Exception("MS Outlook not installed" , ex.InnerException)
                Case Else
                    Throw ex
            End Select
        Finally
            objAnexos = Nothing
            objEndereco = Nothing
            objEnderecos = Nothing
            objMensagem = Nothing
            objOutlook = Nothing
        End Try
    End Sub
End Class

如果Outlook已经运行,你只会看到错误,这很可能意味着Outlook和你的应用程序在不同的安全环境中运行。Outlook是单例的,所以它会尝试连接到已经运行的实例。但是,COM系统不会封送具有不同安全上下文的进程之间的调用。

最新更新