API веб-службы Exchange и неавторизованное исключение 401

Когда я пытаюсь отправить электронное письмо с помощью EWS API, я получаю следующую ошибку: (в message.Send();)

Ошибка запроса. Удаленный сервер возвратил ошибку: (401) Неавторизованный.

Мой код следующий:

ExchangeService exchangeService = new ExchangeService(ExchangeVersion.Exchange2007_SP1);

//WebService Uri
try
{
    exchangeService.Url = new Uri("https://exchangeserver/ews/exchange.asmx");
}
catch (Exception ex)
{
    throw new Exception(string.Format("WebService Uri:" + ex));
}

//Credentials
try
{
    exchangeService.Credentials = new WebCredentials("user@domain", "pwd", "domain");
}
catch (Exception ex)
{
    throw new Exception(string.Format("Credentials:" +  ex));
}

//Send a mail
try
{
    EmailMessage message = new EmailMessage(exchangeService);
    message.Subject = "Test";
    message.Body = "Test";
    message.ToRecipients.Add("destination@domain");
    message.Save();
    message.Send();
}
catch (Exception ex)
{
    throw ex;
}

Я читал другие сообщения на этом сайте об этой проблеме, но они не смогли решить мою проблему.


person GwenGuts    schedule 22.11.2012    source источник
comment
В ситуации, когда соединение EWS ранее работало, а затем не работает, это может быть что-то столь же простое, как истек срок действия пароля, и его необходимо изменить.   -  person RenniePet    schedule 04.11.2017


Ответы (3)


Попробуйте изменить это:

 exchangeService.Credentials = new WebCredentials("user@domain", "pwd", "domain");

в это:

 exchangeService.Credentials = new WebCredentials("user", "pwd", "domain");

Иногда учетные данные для входа зависят от того, как они настроены в Exchange / Active Directory. Это может быть пользователь @ домен или домен \ пользователь

person Carlos Landeras    schedule 22.11.2012
comment
Наши работали локально как «домен \ имя пользователя», однако внешний мне пришлось разделить домен и имя пользователя. - person jtimperley; 16.12.2013
comment
Мне действительно пришлось изменить свое имя пользователя на полный адрес электронной почты, т.е. [email protected], чтобы заставить его работать. Указание домена AD (третий аргумент конструктора WebCredential) не имело для меня никакого значения. - person Coxy; 15.09.2015

В моем случае мне нужно было добавить в виртуальный каталог EWS на сайте IIS список разрешенных URL-адресов.

  1. Перейдите к управлению IIS, щелкните узел EWS под веб-сайтом по умолчанию, затем дважды щелкните Фильтрация запросов.

  2. Перейдите на вкладку URL и справа нажмите Разрешить URL.

  3. Введите URL-адреса, по которым вы будете вызывать службу, например example.com/ews/ или server.example.com/ews/

Вдобавок, в связи с аналогичными проблемами, мне нужно было добавить все хосты (*) к доверенному хосту winrm (по умолчанию у него был указан только локальный IP-адрес).

person KirilStankov    schedule 22.01.2014

Эта проблема может вызвать двустороннюю аутентификацию, предоставляемую Microsoft Office 365. Лучше создать пароль приложения и передать его вместо пароля Outlook.

exchangeService.Credentials = new WebCredentials("email", "app-pwd");
person KSampath    schedule 05.07.2018
comment
для индивидуального письма я могу это сделать. Как насчет всех электронных писем внутри организации? Сценарий: пользователь должен иметь возможность вводить имя пользователя и пароль и иметь возможность получать электронные письма в моем приложении. - person Avishekh Bharati; 05.05.2021