2

使用 Outlook Interop,我创建了一个小应用程序来连接到我的 Outlook 收件箱并收集 30 封电子邮件,然后将它们显示在网格中。当您双击网格中的电子邮件时,它将在 Outlook 中打开该电子邮件。

在应用程序中: - 打开一封电子邮件,将其最小化。然后再打开一个,就可以正常打开了。- 打开一封电子邮件,然后关闭它。再打开另一个,你会得到一个'RPC 服务器不可用。(来自 HRESULT 的异常:0x800706BA)'错误。

我注意到发生这种情况时,系统托盘中的 Outlook 图标会消失。

我尝试创建 Microsoft.Office.Interop.Outlook.Application 和命名空间的新实例并添加此处找到的注册表设置:http: //blogs.msdn.com/b/rgregg/archive/2008/10/27/应用程序-关闭-更改-in-outlook-2007-service-pack-2-beta.aspx

我正在运行 Office 2010。

有谁知道如何解决这个问题?

Imports Microsoft.Office.Interop.Outlook
Imports System.Runtime.InteropServices
Imports System.Reflection

Public Class Form1
    Private m_outlookApplication As Application                                                         'Outlook
    Private m_nameSpace As Microsoft.Office.Interop.Outlook.NameSpace                                   'Outlook's namespace
    Private WithEvents m_inboxItems As Items                                                            'All Outlook inbox items
    Private WithEvents m_calendarItems As Items                                                         'All Outlook calendar items
    Private m_outlookInstalled As Boolean = False                                                       'indicates whether Outlook is installed on computer
    Private m_emails As New List(Of OutlookInboxEmail)                                                  'used to store inbox e-mail messages for grid view control
    Private m_inboxFolder As MAPIFolder                                                                 'Outlook inbox folder
    Private m_calendarFolder As MAPIFolder                                                              'Outlook calendar
    Private m_explorer As Explorer                                                                      'Outlook window explorer
    Private m_name As String = String.Empty                                                             'the name user who is connected
    Public Sub New()
        InitializeComponent()

        connectToOutlook()

        loadInbox()
    End Sub
    Private Sub connectToOutlook()
        m_outlookApplication = New Microsoft.Office.Interop.Outlook.Application
        m_nameSpace = m_outlookApplication.GetNamespace("MAPI")
        m_nameSpace.Logon(Missing.Value, Missing.Value, False, True)
        Dim connectionMode = m_nameSpace.ExchangeConnectionMode
    End Sub
    Private Sub loadInbox()
        Try

            'get inbox folder
            m_inboxFolder = m_nameSpace.GetDefaultFolder(OlDefaultFolders.olFolderInbox)
            'get inbox messages
            m_inboxItems = m_inboxFolder.Items
            m_emails.Clear()
            'display recent messages first
            m_inboxItems.Sort("ReceivedTime", True)

            Dim numberOfEmailsToLoad As Integer = 30
            'set displayed values for each message
            For Each currentItem As Object In m_inboxItems
                Dim emailItem = TryCast(currentItem, MailItem)
                If Not emailItem Is Nothing Then
                    'check whether its e-mail
                    If emailItem.MessageClass = "IPM.Note" Then
                        'set email
                        Dim inboxEmail As New OutlookInboxEmail
                        inboxEmail.SenderName = emailItem.SenderName
                        inboxEmail.Subject = emailItem.Subject
                        inboxEmail.ReceivedTime = emailItem.ReceivedTime.ToString("dd MMMM HH:mm")
                        inboxEmail.Body = emailItem.Body
                        inboxEmail.Unread = emailItem.UnRead
                        inboxEmail.Email = emailItem
                        m_emails.Add(inboxEmail)
                        numberOfEmailsToLoad = numberOfEmailsToLoad - 1
                        If numberOfEmailsToLoad <= 0 Then
                            Exit For
                        End If
                    End If
                End If
            Next

            If m_explorer Is Nothing Then
                Try
                    m_explorer = m_outlookApplication.ActiveExplorer
                Catch ex As System.Exception

                End Try
            End If

            If GridControl1.DataSource Is Nothing Then
                GridControl1.DataSource = Nothing
                GridControl1.DataSource = m_emails
            End If
            GridControl1.RefreshDataSource()
        Catch exception As System.Exception

        End Try
    End Sub
    ''' <summary>
    ''' Opens email in Outlook
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub openEmail()
        If Not GridView1.GetFocusedDataSourceRowIndex < 0 Then
            Dim selectedEmail = TryCast(m_emails(GridView1.GetFocusedDataSourceRowIndex), OutlookInboxEmail)
            If Not selectedEmail Is Nothing Then
                Try

                    If Process.GetProcessesByName("OUTLOOK").Count() = 0 Then

                    End If

                    selectedEmail.Email.Display()
                    selectedEmail.Unread = False
                    selectedEmail.EmailImage = My.Resources.Read_16
                Catch exception As COMException

                End Try
                GridControl1.RefreshDataSource()
            End If
        End If
    End Sub
    Private Sub GridControlCalendar_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridControl1.DoubleClick
        openEmail()
    End Sub
End Class
4

1 回答 1

4

经过几个小时的调查,当一封邮件关闭时,它会随之关闭 Outlook。

解决方案是在与 Outlook 交互之前检查 Outlook 是否打开。每 2 分钟运行一次计时器以运行相同的检查,确保我创建的 Outlook 收件箱视图在 Outlook 关闭时仅过期 2 分钟。

Private Sub openEmail()
        If Not GridViewInbox.GetFocusedDataSourceRowIndex < 0 Then
            Dim selectedEmail = TryCast(m_emails(GridViewInbox.GetFocusedDataSourceRowIndex), OutlookInboxEmail)
            If Not selectedEmail Is Nothing Then
                Try
                    If Process.GetProcessesByName("OUTLOOK").Count() = 0 Then
                        'if outlook is not open.. open it
                        m_selectedEmail = selectedEmail
                        reconnectOutlook()
                    Else
                        'as outlook is open, open the email
                        selectedEmail.Email.Display()
                        selectedEmail.Unread = False
                        selectedEmail.EmailImage = ImageLibrary.My.Resources.Read_16
                        GridControlInbox.RefreshDataSource()
                        m_selectedEmail = Nothing
                    End If
                Catch exception As COMException
                    EventLog.write(exception)
                    MessageBox.Show("Could not open email. Please start Outlook and try again.", "Opening Email", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End Try
                GridControlInbox.RefreshDataSource()
            End If
        End If
    End Sub

重新连接代码...

Private Sub connectToOutlook()
    Try
        m_outlookApplication = New Microsoft.Office.Interop.Outlook.Application
        m_nameSpace = m_outlookApplication.GetNamespace("MAPI")
        'start Outlook
        Dim connectionMode = m_nameSpace.ExchangeConnectionMode
        m_nameSpace.Logon(Missing.Value, Missing.Value, False, True)
        'get the name of user
        m_name = m_outlookApplication.Session.CurrentUser.Name
        m_outlookInstalled = True
    Catch exception As System.Exception
        If Not exception.Message.IndexOf("Class not registered") = -1 Then
            'Outlook is not installed
            m_outlookInstalled = False
            EventLog.write(exception)
        Else
            EventLog.write(exception)
        End If
    End Try
End Sub
于 2013-11-04T09:09:30.317 回答