Во-первых, нет необходимости дважды инициализировать объект экземпляра приложения в коде:
oOutlook = new Outlook.Application();
и
oOutlook = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application;
Во-вторых, нет необходимости использовать метод Logon
.
Вот что MSDN заявляет для этого:
Используйте метод входа в систему только для входа в определенный профиль, когда Outlook еще не запущен. Это связано с тем, что одновременно может выполняться только один процесс Outlook, и этот процесс Outlook использует только один профиль и поддерживает только один сеанс MAPI. Когда пользователи запускают Outlook второй раз, этот экземпляр Outlook запускается в том же процессе Outlook, не создает новый процесс и использует тот же профиль.
Если Outlook уже запущен, использование этого метода не создает новый сеанс Outlook и не меняет текущий профиль на другой.
Если Outlook не запущен и вы хотите запустить Outlook только с профилем по умолчанию, не используйте метод входа в систему. Лучшая альтернатива показана в следующем примере кода, InitializeMAPI: сначала создайте экземпляр объекта приложения Outlook, затем укажите ссылку на папку по умолчанию, такую как «Входящие». Это побочный эффект инициализации MAPI для использования профиля по умолчанию и для полной функциональности объектной модели.
Sub InitializeMAPI ()
' Start Outlook.
Dim olApp As Outlook.Application
Set olApp = CreateObject("Outlook.Application")
' Get a session object.
Dim olNs As Outlook.NameSpace
Set olNs = olApp.GetNamespace("MAPI")
' Create an instance of the Inbox folder.
' If Outlook is not already running, this has the side
' effect of initializing MAPI.
Dim mailFolder As Outlook.Folder
Set mailFolder = olNs.GetDefaultFolder(olFolderInbox)
' Continue to use the object model to automate Outlook.
End Sub
Начиная с Outlook 2010, если у вас есть несколько профилей, вы настроили Outlook на использование всегда профиля по умолчанию, и вы используете метод Logon
для входа в профиль по умолчанию без запроса пользователя, пользователь получит Подскажите, все равно выбрать профиль. Чтобы избежать такого поведения, не используйте метод Logon
; используйте вместо этого обходной путь, предложенный в предыдущем примере InitializeMAPI
.
Итак, ваш код должен выглядеть следующим образом:
Outlook.Application OutlookClient()
{
Outlook.Application oOutlook = null;
Outlook.NameSpace oNS = null;
oOutlook = new Outlook.Application();
// optional
oNS = oOutlook.GetNamespace("MAPI");
Outlook.MAPIFolder folderInbox = oNS.GetDefaultFolder(olFolderInbox)
return oOutlook;
}
См. Приложение C # для автоматизации Outlook (CSAutomateOutlook) пример кода.