Вот фрагмент для взаимодействия с запущенным приложением Outlook.
Try
OutlookObj = System.Runtime.InteropServices.Marshal.GetActiveObject("Outlook.Application")
Catch ex As Exception
Console.WriteLine("Something went wrong while trying to connect to Outlook. Make sure Outlook is running. Press any key to exit.")
Console.Read()
Exit Sub
End Try
OutlookInspectors = OutlookObj.Inspectors
AddHandler OutlookObj.NewMailEx, AddressOf OutlookObj_NewMail
Вот мой обработчик событий для новых сообщений.
Private Sub OutlookObj_NewMail(ByVal ID As String)
Dim Item As Microsoft.Office.Interop.Outlook.MailItem = OutlookObj.Application.Session.GetItemFromID(ID)
'Further processing...
End Sub
Проблема в том, что он зависает на GetItemFromID. В конце концов, я получу исключение ContextSwitchDeadlock. Office - это 2016 (365 профессиональный плюс, x64, версия 1808). Windows 10 1809. Interop - версия 15. Пробовал запускать мое приложение под AnyCPU и x64.





Используйте Namespace.GetItemFromID. Обратите внимание, что второй параметр (идентификатор магазина) не является обязательным. Вы можете опустить его, если в текущем сеансе Outlook уже затронул данный магазин. В противном случае Outlook вызовет исключение «идентификатор неизвестной записи». Если указан идентификатор записи магазина, Outlook сначала откроет его, и поставщик магазина сможет зарегистрировать свои идентификаторы записей в системе MAPI.
Вы можете получить предмет, используя приведенный ниже код:
set App = CreateObject("Outlook.Application")
set NS = App.GetNamespace("MAPI")
NS.Logon
set Msg = NS.GetItemFromID(EntryID)
MsgBox Msg.Subject
Для получения дополнительной информации перейдите по этим ссылкам:
Откройте почтовый элемент Outlook, используя EntryID, StoreID и / или PR_ENTRYID
Да, я знаю, что CSD не обязательно означает проблему. Однако в моем случае это так (обратите внимание, что в моем заголовке написано «зависает бесконечно»).
GetItemFromIDне должен занимать больше нескольких секунд (и для меня он никогда не завершается). Если это неправильный способ получить элемент из локального почтового ящика, я ищу правильный способ. Результаты, которые я нашел в Интернете, неоднозначны и часто касаются VBA / макросов.