none
Авторизация на exchange сервере RRS feed

  • Общие обсуждения

  • C#; NFW 4-4,5; Outlook 2013; Windows Server 2008; MAPI

    Здравствуйте!

    Помогите пожалуйста разобраться с авторизацией на exchange сервере используя C# и Microsoft.Office.Interop.Outlook.

    Суть проблемы. Пишу сервис, который должен проверять почту, и производить некие действия с письмами (читать, парсить, удалать). Так то все предельно просто, только вот застрял я на авторизации на почтовике. Дело в том, что работаю я на доменной машине залогиненой подо мной, а почту мне необходимо смотреть под другой учеткой.

    Вот как я пытаюсь реализовать:

    Outlook.Application OApp = new Outlook.Application();
    Outlook.NameSpace Namespace = OApp.GetNamespace("mapi");
    MessageBox.Show(Namespace.ExchangeMailboxServerName);
    Namespace.Logon(@"DomainName\UserName", "Pass", true, true);
    Outlook.MAPIFolder Inbox = Namespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
    Outlook.Items Items = Inbox.Items.Restrict("[Unread]=true");
    
    foreach (Outlook.MailItem Letter in Items)
    {
        MessageBox.Show(Letter.Body, Letter.Subject);
    }

    Но несмотря на все мои тщетные попытки, я все равно всегда попадаю в свой собственный почтовый ящик, пользователя под которым выполнен вход в Windows. Пробовал разные вариации в поле Prifile, как то: "DomainName\UserName", "UserName", "UserName@DomainName.ru" но сложилось такое впечатление, что строчка Namespace.Logon попросту игнорируется. Я упорно попадаю в свой инбокс вместо инбокса пользователя UserName как задумано. Пожалуйста, помогите мне залогинится в почтовый ящик UserName. Что я делаю не так?

    Да и вот еще. Протокол возможен только MAPI. Если уж совсем никак, возможно покумекать в сторону IMAP.

    Заранее премного благодарен за внимание к моей проблеме.

    3 октября 2013 г. 6:44

Все ответы

  • Добрый день.

    Во всех примерах, которые я смотрю, все именно так как у вас, единственно пишут не "mapi", а "MAPI". Ну и еще одно решение, которое можете попробовать, это запустить Outlook под другим пользователем. Например запустить через класс Process.Start. Только вам надо будет использовать именно ProcessStartInfo и задать UserName и Password. А вот потом, можно подключиться к этому приложению:

    Outlook.Application application = null; 
     
    // Check if there is an Outlook process running. 
    if (Process.GetProcessesByName("OUTLOOK").Count() > 0) 
    { 
        // If so, use the GetActiveObject method to obtain the process and cast it to an Application object. 
        application = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application; 
    } 
    

    3 октября 2013 г. 7:42
    Отвечающий
  • Спасибо за быстрый ответ.

    К сожалению, приведенный вами способ не работает, в строке "OApp = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application;" выдает ошибку - "Операция недоступна (Исключение из HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))". Но тем не менее, вариант от части верный. Запущенный таким образом  аутлук отображает необходимый мне почтовый ящик.  Вопрос по прежнему открыт, но теперь, как мне кажется, я подошел к самой его сути. Нужно вот на этом этапе Outlook.Application OApp = new Outlook.Application(); Каким то образом указать что необходимо запустить аутлук под другим пользователем. Хотя с другой стороны, само приложение аутлук сидит же под несколькими учетками на серваке одновременно, и нормально все у него. Значит есть способ я полагаю.

    Вопрос открыт.

    • Изменено JusteG 3 октября 2013 г. 9:01
    3 октября 2013 г. 8:51