使用EWS API连接到Office 365

28

我正在使用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 中设置你的凭据(用户名/密码)。 - kat0r
8
我赞同你的问题,因为你的问题回答了我的问题。在我的情况下,自动发现无法在远程工作,只能在本地工作,但是只要我明确地设置 service.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx"); 而不是使用自动发现,它就像魔法一样奏效了。再次非常感谢! - Chris
AutoDiscover非常慢,但设置URI效果更好。 - wruckie
4个回答

23

您可以使用以下代码连接到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函数定义一个回调函数,类似于以下内容:

您需要为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身份验证?因为我不能在代码中存储密码。我找到了这篇文章http://www.jeremythake.com/2014/08/using-the-exchange-online-ews-api-with-office-365-api-via-azure-ad/ ,但我不知道ServiceResourceId变量是什么。 - Muflix
1
@Muflix,这是OAuth,而不是Windows身份认证。请参考这篇文章:https://msdn.microsoft.com/en-us/library/office/dn626019(v=exchg.150).aspx#sectionSection1 - Matt
2
为了能够选择正确的Exchange服务版本,例如(changeService(ExchangeVersion.Exchange2013_SP1)),您需要拥有正确版本的"Microsoft.Exchange.WebServices.dll"。这给我带来了很多麻烦,希望对其他人有所帮助。 - Dung
这个还能用吗?对我来说,针对outlook.com和office365.com域的Autodiscover功能会导致各种错误(302、401、找不到主机等)。例如,启用跟踪后,我看到它试图在http://autodiscover.office365.com/autodiscover/autodiscover.xml位置获取某些内容(这似乎是正确的位置),但没有人在那里,我收到“无法解析远程名称”的消息。 - Alex
1
我尝试了相同的代码,但是出现了错误:“无法找到自动发现服务”。 - PerlDev
显示剩余5条评论

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管理中心的设置->域名下找到该域名。最简单的方法是找到以 domain.onmicrosoft.com 形式的回退域。只取domain部分。

  • 用户必须是Microsoft 365管理员

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

编辑

Microsoft不再支持基本身份验证。 请遵循文章以了解如何通过OAuth连接到EWS。 第一次尝试即可成功,没有问题。


2

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

这里的关键是使用WebCredentials而不是NetworkCredential以及电子邮件地址而不是用户名。


2
您现在无法在EWS应用程序中使用基本身份验证(用户名和密码)连接到Office/Microsoft 365。Microsoft不再支持Exchange Online的EWS中的基本身份验证。建议您使用OAuth2.0获取令牌,并在EWS客户端中使用相同的令牌连接到Office 365。
为此,您需要在Azure AD中注册您的应用程序以使用客户端凭据流。我使用控制台应用程序进行了POC。 enter image description here

enter image description here

这是指向 GitHub 代码库和文档的链接。

谢谢,文档很棒 :-) - Muflix
看起来SMTP Auth仍将得到支持:“今天,我们宣布,从2022年10月1日起,我们将开始永久禁用所有租户中的基本身份验证,无论使用情况如何,但SMTP Auth除外。今天,我们宣布,从2022年10月1日起,我们将开始永久禁用所有租户中的基本身份验证,无论使用情况如何,但SMTP Auth除外。”(来源:https://techcommunity.microsoft.com/t5/exchange-team-blog/basic-authentication-and-exchange-online-september-2021-update/ba-p/2772210) - DirectionUnkown
所以我们应该在我们的 Azure ID 中注册我们的应用程序,其中邮箱具有访问权限来发送邮件? - santhoshraj

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