Exchange Web Service API和401未授权异常

28

当我尝试使用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;
}

我在这个网站上阅读了其他关于此问题的帖子,但它们无法解决我的问题。


1
在以前EWS连接工作正常的情况下,现在无法使用,可能仅仅是密码已过期,需要更改。 - RenniePet
你解决了这个问题吗? - Mohamme5d
3个回答

42

尝试更改这个:

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

转化为这样:

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

有时登录凭据取决于Exchange/Active Directory的配置方式。可能是user@domain或domain\user。


我们本地使用的是“domain\username”,但在外部我必须拆分域和用户名。 - jtimperley
1
我实际上不得不将我的用户名切换为完全限定的电子邮件地址,即first.last@contoso.com,才能使其正常工作。对于我来说,指定AD域或不指定(WebCredential构造函数的第三个参数)没有任何区别。 - Coxy

2
在我的情况下,我需要在IIS站点的EWS虚拟目录中添加允许的URL列表。
步骤如下:
  1. 进入IIS管理器,单击EWS节点,在默认网站下双击请求筛选。
  2. 进入URL选项卡,在右侧单击“允许URL”。
  3. 输入您将调用服务的URL,例如example.com/ews/或server.example.com/ews/。
此外,针对类似问题,我需要将所有主机(*)添加到winrm信任主机中(默认情况下只列出本地IP)。

0

这个问题可能会影响到 Microsoft Office 365 提供的双向身份验证。最好创建一个应用程序密码并使用它来代替 Outlook 密码。

exchangeService.Credentials = new WebCredentials("email", "app-pwd");

对于单个电子邮件,我可以做到。那么对于组织内的所有电子邮件呢? 场景:用户应该能够输入用户名和密码,并能够在我的应用程序中检索电子邮件。 - Avishekh Bharati

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接