通过 EWS API 连接到 Office 365

Posted

技术标签:

【中文标题】通过 EWS API 连接到 Office 365【英文标题】:Connection to Office 365 by EWS API 【发布时间】: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 效果更好 【参考方案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 源代码和文档存储库的链接。

【讨论】:

谢谢你,很棒的文档 :-) 似乎仍然支持 SMTP Auth:"Today, we are announcing that, effective October 1, 2022, we will begin to permanently disable Basic Auth in all tenants, regardless of usage, with the exception of SMTP Auth.Today, we are announcing that, effective October 1, 2022, we will begin to permanently disable Basic Auth in all tenants, regardless of usage, with the exception of SMTP Auth." 所以我们应该在邮箱有权发送邮件的 Azure ID 中注册我们的应用程序?【参考方案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 必须是用户的完整电子邮件地址

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

用户必须是 Microsoft 365 管理员

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

【讨论】:

以上是关于通过 EWS API 连接到 Office 365的主要内容,如果未能解决你的问题,请参考以下文章

使用 EWS 和 OAuth 2 的 Office 365 日历 API

SoapUI中读取Office365邮件

从 docker 连接到 office365 SMTP 时出现异常

通过 EWS 检索 Outlook Office365 标记的属性

在Office365上获取对EWS的访问令牌时无效的作用域

为啥 Office 365 连接到 office 按钮不再适用于新的 Microsoft Teams 组?