【问题标题】:Connection to Office 365 by EWS API通过 EWS API 连接到 Office 365
【发布时间】:2015-11-28 02:19:12
【问题描述】:

我在控制台应用程序中使用 EWS API 来处理邮箱项目,我的连接脚本看起来像

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
service.UseDefaultCredentials = true;
service.AutodiscoverUrl("emailService@domain.com");

但我发现我的电子邮件帐户已移至 Office 365 云。我应该如何更改身份验证?

我找到了 EWS 服务网址

 service.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");

但我不知道如何使用它。

谢谢

【问题讨论】:

  • 您很可能只需要在service.Credentials 中设置您的凭据(用户名/密码)。
  • 我对你的问题投了赞成票,因为你的问题就是我问题的答案。在我的情况下,自动发现并不能仅在本地远程工作,但只要我把 service.Url = new Uri("outlook.office365.com/EWS/Exchange.asmx"); 明确地而不是自动发现,它就像一个魅力再次非常感谢你
  • 自动发现很慢,但设置 URI 效果更好

标签: c# .net office365 exchangewebservices


【解决方案1】:

您可以使用以下代码连接到 Office 365 上的 EWS:

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013_SP1);

service.Credentials = new WebCredentials("emailService@domain.com", "password");
service.AutodiscoverUrl("emailService@domain.com", RedirectionUrlValidationCallback);

您需要为 AutodiscoveryUrl 函数定义一个回调函数,如下所示:

private static bool RedirectionUrlValidationCallback(string redirectionUrl)
{
    // The default for the validation callback is to reject the URL.
    bool result = false;

    Uri redirectionUri = new Uri(redirectionUrl);

    // Validate the contents of the redirection URL. In this simple validation
    // callback, the redirection URL is considered valid if it is using HTTPS
    // to encrypt the authentication credentials. 
    if (redirectionUri.Scheme == "https")
    {
        result = true;
    }
    return result;
}

【讨论】:

  • 它有效,谢谢!但是你也知道如何使用 windows 身份验证吗?因为我不能在代码中存储密码。我找到了这篇文章jeremythake.com/2014/08/…,但我不知道什么是 ServiceResourceId 变量。
  • @Muflix,它是 OAuth,而不是 Windows 身份验证。请参考这篇文章:msdn.microsoft.com/en-us/library/office/…
  • 为了能够选择正确版本的 Exchange 服务,例如 (changeService(ExchangeVersion.Exchange2013_SP1)),您需要拥有正确版本的“Microsoft.Exchange.WebServices.dll”。这让我很头疼,我希望它可以帮助其他人。
  • 这还能用吗?对我来说,针对 outlook.com 和 office365.com 域的自动发现功能会导致各种错误(302、401、找不到主机)。例如,启用跟踪后,我看到它试图在autodiscover.office365.com/autodiscover/autodiscover.xml 位置(这似乎是正确的位置)获取一些东西,但没有人在那里,我得到“无法解析远程名称”。
  • 我尝试了确切的代码,但出现错误“找不到自动发现服务”。
【解决方案2】:

我知道这是一个相当古老的解决方案,但它对我仍然很有帮助。我有一些工具可以与 Exchange 的“普通”网络版本一起使用,但到目前为止,我对 Exchange Online 的测试失败(我遇到了诸如“找不到自动发现服务”等错误)。

这里的关键是使用 WebCredentials 代替 NetworkCredential 和使用电子邮件地址代替用户名。

【讨论】:

    【解决方案3】:

    您现在无法在 EWS 应用程序中使用基本身份验证(用户名和密码)连接到 Office/Microsoft 365。 Microsoft 不再支持 EWS for Exchange Online 中的基本身份验证。建议您使用 OAuth2.0 获取令牌并在您的 EWS 客户端中使用该令牌连接到 Office 365。

    为此,您必须在 Azure AD 中注册您的应用程序才能使用客户端凭据流。我使用控制台应用程序对此进行了 POC。

    这里是指向GitHub 源代码和文档存储库的链接。

    【解决方案4】:

    在安全性方面,EWS 与 office365 的连接似乎发生了一些变化,导致 Matt 的回答对我不起作用。

    以下是有效的:

    ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013_SP1)
    {
         Credentials = new WebCredentials("user", "password", "domain"),
         Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx")
    };
    

    进口注意事项:

    • AutodiscoverUrl没有成功完成,每次都找不到url

    • user 必须是用户的完整电子邮件地址。

    • domain 是NetBIOS 域名,意味着它只是域名。 您可以在 Microsoft 365 管理中心的 Settings -> Domains 下找到域。最简单的方法是找到domain.onmicrosoft.com 形式的备用域。只取domain 部分。

    • 用户必须是 Microsoft 365 管理员

    • 这些参数之一的任何更改都会导致Unauthorized 异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      • 2015-07-19
      • 2018-06-09
      • 1970-01-01
      相关资源
      最近更新 更多