Exchange Web Service API and 401 unauthorized exception
When I try sending email using the EWS API, I get the following error: (in message.Send();
)
The request failed. The remote server returned an error: (401) Unauthorized.
My code is the following:
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;
}
I read other posts on this site concerning this issue but they couldn't resolve my issue.
Try changing this:
exchangeService.Credentials = new WebCredentials("user@domain", "pwd", "domain");
into this:
exchangeService.Credentials = new WebCredentials("user", "pwd", "domain");
Sometime the Login credentials depends on how Exchange/Active Directory it's configured. It could be user@domain or domain\user
In my case, I needed to add to the EWS Virtual Directory under the IIS site the list of allowed URLs.
-
Go to the IIS management, click the EWS node, under the Default Web Site, then double-click the Request Filtering.
-
Go to the URL tab, and on the right, click Allow URL.
-
Enter the URLs by which you will invoke the service, e.g. example.com/ews/ or server.example.com/ews/
In addition, related to similar issues, I needed to add all hosts (*) to the winrm trusted host (by default it had only the local IP listed).