Доступ к Outlook через ошибку Visual Basic

Я пытаюсь создать программу, которая извлекает все электронные письма из папки «Входящие» Outlook (версия для настольных компьютеров 2007 г.) и помещает их в DataGridView.

Код:

Imports Outlook = Microsoft.Office.Interop.Outlook

Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim dt As DataTable
    Try
        Dim app As Outlook.Application = New Outlook.Application()
        Dim ns As Outlook.[NameSpace] = app.GetNamespace("MAPI")
        Dim inbox As Outlook.MAPIFolder = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox)
        ns.SendAndReceive(True)
        dt = New DataTable("Inbox")
        dt.Columns.Add("Subject", GetType(String))
        dt.Columns.Add("Sender", GetType(String))
        dt.Columns.Add("Body", GetType(String))
        dt.Columns.Add("Date", GetType(String))
        DataGridView1.DataSource = dt
        For Each item As Object In inbox.Items
            If TypeOf item Is Outlook.MailItem Then
                Dim item1 As Outlook.MailItem = CType(item, Outlook.MailItem)
                dt.Rows.Add(New Object() {item1.Subject, item1.Sender, item1.HTMLBody, item1.SentOn.ToLongDateString() & "" + item1.SentOn.ToLongTimeString()})
            End If
        Next
        MessageBox.Show("done")
    Catch ex As Exception
        MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.[Error])
    End Try
End Sub
End Class

Когда я пытаюсь собрать проект, я получаю следующую ошибку:

System.Runtime.InteropServices.COMException (0x80040154): не удалось получить фабрику классов COM для компонента с CLSID {0006F03A-0000-0000-C000-000000000046} из-за следующей ошибки: 80040154 класс не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG) ))

ОБНОВЛЕНИЕ

Я изменил процессор компилятора на x86 и x64, это не устраняет ошибку.

Целевая платформа


person NielsStenden    schedule 04.12.2017    source источник
comment
ваш код? потому что я пытался сделать что-то подобное, но я не мог найти идеального решения... откуда ты это взял?   -  person Christopher H.    schedule 05.12.2017
comment
Я не знаю, работает ли этот код, так как я не могу запустить программу из-за ошибки.   -  person NielsStenden    schedule 05.12.2017


Ответы (3)


Какова целевая платформа вашего приложения? Это приложение на базе x86?

Проблема (вероятно) в том, что COM-класс (который находится в 32-битной COM-dll) прописан, но поскольку приложение работает в 64-битном режиме, оно не находит правильную регистрацию (32-битные и 64-битные COM-серверы зарегистрированы по отдельности).

Также вы можете найти Как решить Класс исключений COM не зарегистрирован (исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))? страница полезная.

person Eugene Astafiev    schedule 04.12.2017
comment
Я изменил режим компиляции VS2017 на x64 и x86 и попробовал оба из них. Все еще получаю ошибку. - person NielsStenden; 05.12.2017
comment
Попробуйте восстановить MS Office. Похоже, что-то не так с вашими записями реестра Windows, они повреждены. - person Eugene Astafiev; 05.12.2017
comment
Я также восстановил MS Office, еще не удалял и не переустанавливал. Думаешь, удаление и переустановка могут помочь? - person NielsStenden; 05.12.2017

Проблема, вызывающая ошибку, заключалась в том, что оба приложения (VS2015 и MS Office 2007) не работали с одинаковыми правами. Откройте оба приложения с одинаковыми правами (администратора или пользователя) и приложение заработает. Спасибо за помощь!

person NielsStenden    schedule 05.12.2017

попробуйте этот метод и отправьте ему аргументы, такие как тема, тело, адрес, имя файла... Я уверен, что это сработает.

Private Sub SendfromOutlook(sSubject As String, sBody As String, sTo As String, sFilename As String)
    Dim oApp As Interop.Outlook._Application
    oApp = New Interop.Outlook.Application
    Dim oMsg As Interop.Outlook._MailItem

    Dim strS As String()
    strS = sTo.Split(",")
    For i As Integer = 0 To strS.Length - 1

        oMsg = oApp.CreateItem(Interop.Outlook.OlItemType.olMailItem)
        oMsg.Subject = sSubject
        oMsg.Body = sBody
        oMsg.To = strS(i)

        Dim str As String = sFilename

        If sFilename <> "" Then


            Dim sBodyLen As Integer = Int(sBody.Length)
            Dim oAttachs As Interop.Outlook.Attachments = oMsg.Attachments
            Dim oAttach As Interop.Outlook.Attachment
            oAttach = oAttachs.Add(str, , sBodyLen)

        End If

        oMsg.Send()

    Next
    MessageBox.Show("EMail Sent Successfully!", "Information", MessageBoxButtons.OK)
    ClearAll()
End Sub

здесь я использую To address with "," для отправки нескольких писем за раз. Вот почему я просто разделил его и использовал эту функцию как циклическую ( Dim strS As String() и strS = sTo.Split(",") )

person Prakash    schedule 05.12.2017
comment
Хороший код! Но это не ответ на мой вопрос. Моя главная проблема заключалась в том, что я получил ошибку, теперь это исправлено. Я использовал Outlook и VS2015 с разными правами (пользователь и администратор), когда я запускаю оба от имени администратора, программа работает. Спасибо, в любом случае! - person NielsStenden; 06.12.2017