Exchange邮件开发

参考:

学习笔记-Exchange Web Service API-概述

官网 

概述

1、探索Exchange中的EWS托管API,EWS和Web服务

使用Exchange中的EWS托管API,EWS,自动发现和其他Web服务来创建用于管理台式机和移动设备以及在线上的企业电子邮件,日历和联系人的解决方案。

Exchange提供了Exchange Web服务(EWS)和其他Web服务,可用于实现访问和管理Exchange存储项目的客户端应用程序。

注:许可信息主题中指定的条款适用于您对这些内容的使用。 请仔细阅读条款。

2、创建EWS托管API,EWS和Web服务解决方案
使用下表查找可帮助您了解和使用Exchange中的EWS托管API,EWS和Web服务的内容。 

如果您要...从这里开始
开始使用第一个 .NET Framework EWS 客户端应用程序。
EWS 托管 API 客户端应用程序入门
开始使用第一个 EWS 客户端应用程序。
开始使用 EWS 客户端应用程序
了解有关 EWS 托管 API 和 EWS 中的最新功能。
Exchange 中的 EWS 的新增功能
了解使用 Exchange 的 Web 服务开发基础知识。
Start using web services in Exchange
查看一些 EWS 托管 API 代码示例。
Exchange 2013:101代码示例
查找 EWS 托管 API 和 EWS 应用程序的设计指南。
Exchange 的 EWS 客户端设计概述
查找 EWS 托管 API 和 EWS 的操作方法信息和代码示例。
开发 Exchange 的 Web 服务客户端
查找参考材料。
Exchange web 服务引用

当 EWS 应用程序请求从 Exchange 存储的信息时,符合标准的 SOAP XML 请求消息创建并发送到 Exchange 服务器中。 Exchange 服务器接收请求时,它验证客户端提供的凭据,并自动分析所请求的数据的 XML。 然后,服务器建立 SOAP 响应,其中包含代表请求的强类型的对象及其属性的 XML 数据。 XML 数据发送回 HTTP 响应中的应用程序。 应用程序然后 XML 反序列化和使用数据修订的强类型的对象。

EWS托管API客户端应用程序入门

使用EWS托管API为Exchange开发一个简单的Hello World电子邮件客户端应用程序。

EWS托管API提供了直观,易于使用的对象模型,用于从客户端应用程序,门户网站应用程序和服务应用程序发送和接收Web服务消息。 您可以使用EWS托管API访问存储在Exchange Online,作为Office 365一部分的Exchange Online或Exchange服务器邮箱中的几乎所有信息。 您可以使用本文中的信息来帮助您开发第一个EWS托管API客户端应用程序。

【注:EWS托管API现在可以作为GitHub上的开源项目使用。 您可以使用开源库执行以下操作:

对API进行错误修复和增强。
在正式版本中获得修复和增强功能之前,请先获取修复和增强功能。
访问API的最全面,最新的实现,以用作参考或在新平台上创建新库。
我们欢迎您通过GitHub做出贡献。】

您需要一台Exchange服务器

如果您已经有一个Exchange邮箱帐户,则可以跳过此部分。 否则,您可以使用以下选项为第一个EWS客户端应用程序设置Exchange邮箱:

确认可以从Exchange发送和接收电子邮件之后,就可以设置开发环境了。 您可以使用Exchange Web客户端Outlook Web App来验证是否可以发送电子邮件。

设置您的开发环境

确保您有权访问以下内容:

  • 支持.NET Framework 4的任何版本的Visual Studio。尽管从技术上讲,您不需要Visual Studio,因为可以使用任何C#编译器,但建议您使用它。
  • EWS托管API。 您可以使用64位或32位版本,具体取决于您的系统。 使用默认安装位置。

创建您的第一个EWS托管API应用程序

这些步骤假定您设置了Office 365开发人员站点。 如果您下载并安装了Exchange,则需要在Exchange服务器上安装有效的证书,或者对默认提供的自签名证书实施证书验证回调。 另请注意,这些步骤可能会略有不同,具体取决于您使用的Visual Studio版本。

1、创建C# 控制台程序

2、添加对EWS托管API的引用
可以直接nuget添加Microsoft.Exchange.WebServices

3、为自动发现设置URL重定向验证
添加以下重定向验证回调方法。 这可以验证由自动发现返回的重定向URL是否代表HTTPS端点。

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;
}
View Code

验证重定向URL的内容。 在此简单的验证回调中,如果重定向URL使用HTTPS加密身份验证凭据,则该重定向URL被视为有效。

该验证回调将在下面步骤中传递到ExchangeService对象。您需要这样做,以便您的应用程序信任并遵循自动发现重定向-自动发现重定向的结果为我们的应用程序提供了EWS端点

4、准备ExchangeService对象

使用您要定位的服务版本实例化ExchangeService对象。 本示例以EWS模式的最早版本为目标。

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);

如果您以本地Exchange服务器为目标并且客户端已加入域,则可以使用登录用户的默认凭证:

service.UseDefaultCredentials = true;

如果客户端以Exchange Online或Office 365开发人员站点邮箱为目标,则必须传递显式凭据。 在实例化ExchangeService对象之后添加以下代码,并设置您的邮箱帐户的凭据。 用户名应为用户主体名称。 

service.Credentials = new WebCredentials("user1@contoso.com", "password");

如果您的客户端以Exchange Online或Office 365开发人员站点邮箱为目标,请验证UseDefaultCredentials是否设置为false,这是默认值。 您的客户端已准备就绪,可以首次调用自动发现服务,以获取调用EWS服务的服务URL。

ExchangeService对象上的AutodiscoverUrl方法执行对Autodiscover服务的一系列调用,以获取服务URL。 如果此方法调用成功,则将使用服务URL设置ExchangeService对象上的URL属性。

将用户的电子邮件地址和RedirectionUrlValidationCallback传递给AutodiscoverUrl方法。 在上面指定了凭据之后,添加以下代码。将user1@contoso.com更改为您的电子邮件地址,以便自动发现服务找到您的EWS端点。

service.AutodiscoverUrl("user1@contoso.com", RedirectionUrlValidationCallback);

此时,您的客户端已设置为调用EWS以访问邮箱数据。 如果现在运行代码,则可以通过检查ExchangeService.Url属性的内容来验证AutodiscoverUrl方法调用是否有效。 如果此属性包含URL,则您的调用成功! 这意味着您的应用程序已成功通过服务进行身份验证,并发现了邮箱的EWS端点。 现在,您可以开始对EWS进行首次调用了。 阅读有关 使用EWS托管API设置EWS服务URL的更多信息,有关设置EWS URL的信息。

5、创建您的第一条Hello World电子邮件

调用AutodiscoverUrl方法后,实例化一个新的EmailMessage对象,并传入您创建的服务对象。

EmailMessage email = new EmailMessage(service);

现在,您将在电子邮件上设置服务绑定。 在EmailMessage对象上发起的所有调用都将针对该服务。

现在,设置电子邮件的“收件人,请更改user1@contoso.com以使用您的SMTP地址。

email.ToRecipients.Add("user1@contoso.com");

设置电子邮件的主题和正文。

email.Subject = "HelloWorld";
 email.Body = new MessageBody("This is the first email I've sent by using the EWS Managed API.");

现在,您可以使用EWS托管API发送第一封电子邮件。 Send方法将调用服务并提交电子邮件以进行传递。 阅读 使用EWS托管API与EWS进行通信 以了解可用于与Exchange通信的其他方法。

您已经准备好运行Hello World应用程序。 在Visual Studio中,选择F5。 一个空白的控制台窗口将打开。 在对应用程序进行身份验证,遵循自动发现重定向并进行首次调用以创建发送给自己的电子邮件时,控制台窗口中将看不到任何内容。 如果要查看正在进行的调用,请在调用AutodiscoverUrl方法之前添加以下两行代码。 然后按F5。 这将找出EWS对控制台窗口的请求和响应。

service.TraceEnabled = true;
service.TraceFlags = TraceFlags.All;

示例:

using System;
using Microsoft.Exchange.WebServices.Data;
namespace HelloWorld
{
  class Program
  {
    static void Main(string[] args)
    {
      ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
      service.Credentials = new WebCredentials("user1@contoso.com", "password");
      service.TraceEnabled = true;
      service.TraceFlags = TraceFlags.All;
      service.AutodiscoverUrl("user1@contoso.com", RedirectionUrlValidationCallback);
      EmailMessage email = new EmailMessage(service);
      email.ToRecipients.Add("user1@contoso.com");
      email.Subject = "HelloWorld";
      email.Body = new MessageBody("This is the first email I've sent by using the EWS Managed API");
      email.Send();
    }
    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;
    }
  }
}
View Code

设置EWS服务URL

查找有关如何在EWS托管API应用程序中设置EWS服务URL的信息。

服务URL是Exchange用于与Exchange Web服务(EWS)通信的地址。 在您的EWS托管API应用程序拥有此地址,并具有与EWS进行通信的适当访问权限之后,它可以调用ExchangeService类。 本地Exchange服务器的服务URL可能如下所示。

https://computer.domain.contoso.com/EWS/Exchange.asmx

此URL在客户端访问服务器上找到exchange.asmx文件。

您可以通过两种方法在应用程序中设置EWS URL(但不要同时使用)。

我们建议您使用自动发现服务来获取URL,因为在大型的服务器林中,如果将邮箱迁移到另一台服务器,URL可能会更改。 但是,由于调用Autodiscover会花费一些时间,并且如果需要在短时间内进行多次调用会降低您的应用程序的速度,因此您可能希望缓存从Autodiscover获得的URL值,并以此手动设置EWS服务URL 缓存的值。 这将提高您的应用程序的性能。 只要确保您使用自动发现来定期更新缓存的值,以防服务器上的值更改。

1、使用自动发现服务设置EWS服务URL

AutodiscoverUrl方法使用电子邮件地址来设置ExchangeService终结点,并使您的应用程序可以使用ExchangeService代理类中包含的任何方法。 下面的示例演示如何使用AutodiscoverURL方法。

// Create the binding.
ExchangeService service = new ExchangeService();
// Set the credentials for the on-premises server.
service.Credentials = new WebCredentials("user1@contoso.com", "password");
// Set the URL.
service.AutodiscoverUrl("User1@contoso.com");

2、手动设置Exchange服务URL

以下示例说明如何使用缓存的值设置EWS服务URL。 在执行此操作之前,请确保使用自动发现服务来获取EWS URL。

// Create the binding.
ExchangeService service = new ExchangeService();
// Set the credentials for the on-premises server.
service.Credentials = new WebCredentials("user1@contoso.com", "password");
// Set the URL.
service.Url = new Uri("https://computername.domain.contoso.com/EWS/Exchange.asmx");

与EWS通信

使用EWS托管API与Exchange中的EWS通信

EWS托管API中的ExchangeService类包含用于设置用户凭据,标识EWS端点,发送和接收SOAP消息以及配置绑定以与EWS进行通信的方法和属性。 在使用EWS托管API执行任何任务之前,您必须创建ExchangeService类的实例并将其绑定到EWS。

在使用用户凭据和EWS端点设置ExchangeService对象之后,任何引用ExchangeService对象的邮箱对象都可以使用以下方法类型与EWS通信:

  • ExchangeService对象方法-ExchangeService对象上所有未从基本Object类型继承的方法都调用EWS。
  • Exchange邮箱项目和文件夹类型方法。

与EWS通讯的邮箱项目和文件夹类型方法有:

增删改查 赋值 移动

ExchangeService 

1、实例化:ExchangeService service = new ExchangeService();

使用空的构造函数实例化ExchangeService将创建绑定到最新已知Exchange版本的实例。 或者,您可以通过将version指定为参数来指定特定版本的Exchange。 ExchangeService service=new ExchangeService(ExchangeVersion.Exchange2007_SP1);

2、设置向Exchange服务器发送请求的用户的凭据。 如果要使用已验证用户的凭据从登录到域的计算机连接到EWS,请将ExchangeService对象上的UseDefaultCredentials属性设置为true。

如果您不想使用默认的用户凭据进行连接,请在ExchangeService对象上设置Credentials属性以显式指定其他用户的凭据。 如果您将Exchange Online或Exchange Online用作Office 365的一部分,则将使用基本身份验证,仅使用用户名和密码。 NTLM身份验证需要域名domain。

// Connect by using the credentials of user1 at contoso.com.
service.Credentials = new WebCredentials("user1@contoso.com", "password");

您还可以使用用户的域名和密码来指定用户的凭据。

// Connect by using the credentials of contoso/user1.
service.Credentials = new WebCredentials("user1", "password", "contoso");

跟踪请求和响应以对EWS托管API应用进行故障排除

调试基于Web服务的应用程序可能很困难,因为部分处理是在您可能无权访问的远程计算机上执行的。因为您无法单步执行服务器上的代码,所以查看客户端和服务器之间发送的XML请求和响应来确定应用程序的哪一部分导致了错误可能会有所帮助。

如果您使用的是EWS,则已经可以访问XML请求和响应了;您可以在代码中放置一个断点,以查看服务器对您请求的响应,以解决问题。

如果您使用的是EWS托管API,则没有直接访问EWS请求和响应的权限。但是,您可以在ExchangeService对象上使用跟踪方法来捕获XML请求和响应,然后可以使用XML确定代码为什么不起作用

例如,如果未正确设置属性,则可能会收到意外的响应,并且可以使用跟踪输出查看XML请求和响应以识别错误。 EWS托管API的跟踪输出还可以帮助您手动构建XML请求以创建EWS应用程序。如果使用的是EWS,则可以使用EWS托管API创建一个小型应用程序,对其进行跟踪,然后使用XML请求信息来帮助您构建EWS请求。

在ExchangeService对象上启用跟踪

要启用跟踪,请为您的应用程序创建一个ExchangeService对象,然后设置跟踪属性,如以下示例所示。

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010);
service.TraceListener = ITraceListenerInstance;
// Optional flags to indicate the requests and responses to trace.
service.TraceFlags = TraceFlags.EwsRequest | TraceFlags.EwsResponse
service.TraceEnabled = true;

将TraceEnabled属性设置为true后,所有与跟踪标志匹配的请求都将发送到指定的跟踪侦听器。 您可以指定一个跟踪标志,也可以通过将多个跟踪标志与逻辑或相结合来指定多个跟踪标志。 您可以使用TraceFlags枚举为EWS以及自动发现请求和响应指定值。

实现一个TraceListener对象

您可以将TraceEnabled属性设置为true,以将XML请求和响应输出到您的应用程序,例如控制台窗口。

如果要控制跟踪输出并将其保存到文件中,建议您实现TraceListener类对象。 以下代码示例显示了一个简单的对象,该对象实现了ITraceListener接口,并将跟踪的请求和响应存储在XML或文本文件中。

class TraceListener : ITraceListener
{
    #region ITraceListener Members
    public void Trace(string traceType, string traceMessage)
    {
      CreateXMLTextFile(traceType, traceMessage.ToString());
    }
    #endregion
    private void CreateXMLTextFile(string fileName, string traceContent)
    {
      // Create a new XML file for the trace information.
      try
      {
        // If the trace data is valid XML, create an XmlDocument object and save.
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(traceContent);
        xmlDoc.Save(fileName + ".xml");
      }
      catch
      {
        // If the trace data is not valid XML, save it as a text document.
        System.IO.File.WriteAllText(fileName + ".txt", traceContent);
      }
    }
}
View Code

开始

概述

开始在Exchange中使用Web服务

Exchange中的Web服务 提供对存储在Exchange Online,作为Office 365一部分的Exchange Online以及从Exchange Server 2007开始的Exchange本地版本中存储的邮箱数据的访问,并使您能够创建可用于管理该应用程序的自定义应用程序 根据组织的要求提供信息。 虽然您可以创建的EWS和Web服务应用程序范围实际上是无限的,但是某些基本概念适用于任何类型的应用程序。 

建立您的知识

无论您使用.NET Framework还是其他平台来开发Web服务应用程序,在开始开发项目之前,您都希望了解一些重要概念。

体系结构

了解EWS在Exchange体系结构中如何工作以及它使用的协议。

【Exchange Server是服务器,开发exchange客户端 通过webservice访问Exchange Server】

Exchange Web服务(EWS)是一种跨平台的API,使应用程序能够从Exchange Online,作为Office 365的一部分的Exchange Online或从Exchange Server2007开始的本地版本的Exchange访问邮箱项目,例如电子邮件,会议和联系人

EWS应用程序可以通过在基于SOAP的XML消息中发送请求 来本地或远程访问邮箱项目(mailbox items)。 SOAP消息在应用程序和服务器之间发送时嵌入在HTTP消息中,这意味着只要您的应用程序可以通过HTTP发布XML,它就可以使用EWS访问Exchange。

Exchange体系结构概述

下图显示了与Exchange 2013和Exchange Online通信时EWS应用程序使用的身份验证方法和通信路径。 从EWS应用程序的角度来看,通信路径是相同的,并且身份验证方法仅稍有不同。 主要区别在于您对Exchange后端的可见性。

图1. EWS应用程序和Exchange内部部署体系结构

以下是图中显示的组件:

  • EWS应用程序-它可以是客户端,门户或服务应用程序,可以安装在客户端上或Exchange本地客户端访问服务器上。 如果使用EWS托管API开发EWS应用程序,则必须在客户端上安装EWS托管API程序集,然后由您的应用程序重新分发。
  • SOAP XML消息— SOAP信封中的XML消息,嵌入在符合客户端访问服务器上Services.wsdl文件的HTTP / S消息中。 建议对本地Exchange使用HTTPS,对于Exchange Online必须使用HTTPS。
  • 身份验证方法-EWS消息包括基本,NTLM(Windows集成身份验证)或OAuth身份验证信息,作为HTTP有效负载的一部分。
  • 负载平衡器-负载平衡器将邮件分发到客户端访问服务器阵列中的客户端访问服务器。 该组件仅在Exchange内部部署体系结构中可见。
  • 客户端访问服务器阵列—客户端访问服务器被组织到一个称为客户端访问服务器阵列的负载均衡组中。各个客户端访问服务器提供身份验证,有限的重定向和代理服务。客户端访问服务器本身不进行任何数据呈现,并且没有数据排队或存储在客户端访问服务器上-它是精简且无状态的;它仅对请求进行身份验证,执行自动发现查找,然后将请求代理到邮箱服务器。客户端访问服务器确实与承载用户数据的邮箱服务器保持1:1关系。在客户端访问服务器和邮箱服务器之间使用HTTP协议(通过使用自签名证书的SSL进行保护)。该组件仅在Exchange内部部署体系结构中可见。
  • 自动发现服务-自动发现服务通过访问Active Directory域服务(AD DS)来检索邮箱版本和托管用户数据的活动副本的邮箱服务器的位置,从而执行服务发现。
  • EWS服务-EWS服务由三个文件描述:Services.wsdl,Messages.xsd和Types.xsd,以及EWS托管API程序集。 Services.wsdl描述了客户端和服务器之间的协定,Messages.xsd定义了请求和响应SOAP消息,Types.xsd定义了SOAP消息中使用的元素。尽管存在较早版本的架构,但Messages.xsd和Types.xsd始终包含架构的最新版本。请注意,Services.wsdl,Messages.xsd和Types.xsd在客户端访问服务器上可用,但实际上并未用于架构验证-提供它们仅供参考。 EWS托管API程序集是为服务器端EWS客户端应用程序提供的,并且部署在所有Exchange Server角色上,而不仅是客户端访问服务器。该组件仅在Exchange内部部署体系结构中可见。

  功能可用性基于您的应用程序针对的EWS模式版本。由于EWS架构是向后和向前兼容的,因此,如果您创建针对早期架构版本的应用程序(例如Exchange 2007 SP1),则您的应用程序也将与更高版本的架构版本一起使用,例如Exchange 2010 SP2服务。作为Exchange Online。因为功能和功能更新由架构驱动,所以我们建议您使用最早的通用代码库,该代码库针对要在客户端应用程序中实现的EWS功能。许多应用程序可以使用Exchange2007_SP1版本,因为Exchange 2007 SP1架构几乎包含用于处理Exchange存储中项目和文件夹的所有核心Exchange功能。有关更多信息,请参见EWS客户端功能。

  • 数据库可用性组(DAG)-邮箱服务器被组织成一个高可用性的DAG,可以将其部署在一个或多个数据中心中。 邮箱服务器包含邮箱数据库,并处理该服务器上活动邮箱的所有活动。 处理,呈现和存储数据的所有组件都在邮箱服务器上。 客户端不直接连接到邮箱服务器。 所有连接均由客户端访问服务器处理。 该组件仅在Exchange内部部署体系结构中可见。
  • 作为Office 365一部分的Exchange Online和Exchange Online-托管的邮件解决方案,将Exchange功能作为基于云的服务提供。

流程:

当EWS应用程序从Exchange存储请求信息时,将创建符合SOAP标准的XML请求消息并将其发送到Exchange服务器。

当Exchange服务器收到请求时,它将验证客户端提供的凭据,并自动为请求的数据解析XML。

然后,服务器构建一个SOAP响应,该响应包含表示请求的强类型对象及其属性的XML数据。 XML数据通过HTTP响应发送回应用程序。

然后,应用程序反序列化XML,并使用数据来重构强类型对象。

EWS application types

了解可以通过在Exchange中使用EWS创建的最常见的应用程序类型。

EWS和Exchange体系结构提供了统一的开发模型,可用于以一致的方式创建最常见的应用程序类型,包括以下内容:

  • 客户端应用程序-使用EWS访问Exchange数据的独立应用程序。 Outlook和Outlook Web App是客户端应用程序的示例
  • 门户应用程序-通过包括从Exchange检索到的信息(例如忙/闲或联系信息)来扩展现有网页的应用程序。检索Exchange数据的SharePoint Web部件是门户应用程序的示例。
  • 服务应用程序-后台作业,用于将Exchange中的数据集成或同步到现有系统中。例如,将联系人信息从Exchange同步到CRM应用程序的应用程序。

这些应用程序模型中的每一个都可以使用通用的代码库来从Exchange检索信息-因此,您无需更改用于在客户端,门户或服务应用程序之间检索项目信息的EWS代码。从一个应用程序到下一个应用程序可能会改变的是邮箱访问和身份验证机制。例如,客户端应用程序通常使用直接用户访问和基本或NTLM身份验证,而服务应用程序可能使用模拟来进行邮箱访问和OAuth身份验证。

客户端应用程序通常使用直接访问和基本或NTLM身份验证,因此,用户只能使用自己的登录凭据访问自己邮箱中的信息。 客户端应用程序还应该支持已被授予访问另一用户邮箱权限的用户的委托访问。

EWS客户端应用程序入门

通过在Exchange中使用Exchange Web服务(EWS)创建第一个应用程序

EWS是一项全面的服务,您的应用程序可以使用它来访问存储在Exchange Online,作为Office 365一部分的Exchange Online或Exchange内部邮箱中的几乎所有信息。 EWS使用标准的Web协议来提供对Exchange服务器的访问; EWS托管API之类的库包装了EWS操作以提供面向对象的接口。在运行完本文中的示例之后,您将对EWS可以做什么有一个基本的了解。

您可以从任何操作系统或语言调用EWS操作,因为EWS请求和响应都使用SOAP协议。本文中的示例使用C#编写,并使用.NET Framework HttpWebRequest和HttpWebResponse对象。但是,代码的重要部分是用于发出EWS请求的XML和从服务器返回的XML响应。这些代码示例强调XML事务,而不处理XML。

创建您的第一个EWS应用程序
您将创建的EWS应用程序显示两种使用EWS的典型方案:

  • 从Exchange邮箱获取信息,并将该信息显示给用户。
  • 执行诸如发送电子邮件之类的操作,然后检查响应以查看该操作是否成功。

示例:

设置EWS应用程序

查找有关您需要完成的任务的信息,以便创建使用EWS托管API或EWS与Exchange通信的应用程序。

创建客户端应用程序以在Exchange Online,作为Office 365的一部分的Exchange Online或从Exchange 2013开始的Exchange版本上调用Web服务时,您需要设置应用程序以与Exchange服务器通信。 本节中的文章提供了代码示例,向您展示了如何使用Exchange Web服务(EWS)托管API或EWS XML请求和响应来设置应用程序。

设置开发环境

在开始编写Exchange Web服务(EWS)应用程序之前,需要确保开发环境满足一些最低要求。 您可以使用EWS托管API(用于.NET Framework应用程序的标准客户端访问API)来开发您的应用程序,也可以在没有自动生成代理的情况下单独使用EWS。 通常,我们建议您使用EWS托管API; 但是,您可以更详细地探索这两个选项之间的区别,以找出最适合您的一个。

1、使用EWS托管API,直接引用相关包

2、使用原生Webservice,xml请求与响应

您可以使用EWS以两种不同的方式开发应用程序。

使用EWS的最简单方法是创建包含XML请求的文本文件,并将其传输到Exchange。为此,这是您需要的:

  • 一个简单的文本编辑器(例如记事本)可以编辑XML请求。任何文本编辑器都可以做,尽管您可能想要一个可以帮助XML语法验证的工具,例如XMetal。
  • 可以发送和接收SOAP XML请求和响应以便与Exchange通信的工具或应用程序。

使用原始XML时,对XML格式有基本了解也很有帮助。

使用EWS的第二种方法是创建一个自动生成的代理,该代理使您能够使用诸如C#之类的.NET语言来处理这些操作。这是使用自动生成的代理所需的内容:

  • 从Visual Studio 2005开始的Visual Studio版本,用于创建代理引用。您可以下载免费版本。
  • 从.NET Framework 2.0开始的.NET Framework版本。您可以从Microsoft下载中心下载.NET Framework 3.5。

如果您使用自动生成的代理,则需要熟悉C#编程。

注:如果您是.NET Framework开发人员,我们建议您使用EWS托管API而不是自动生成的代理来针对EWS进行开发。 与自动生成的代理对象模型相比,EWS托管API对象模型更易于使用。 此外,EWS托管API实现了自动发现功能,并包含客户端逻辑。

控制客户端应用程序访问 

您创建的任何EWS客户端应用程序都必须被授予访问Exchange Online,作为Office 365一部分的Exchange Online或从Exchange 2013开始的Exchange版本的权限,然后才能调用EWS操作。测试或生产服务器管理员可以使用Exchange命令行管理程序来限制所有用户和应用程序,单个用户或单个应用程序对EWS的访问。 EWS的访问控制基于域帐户。当使用由本地安全机构认证的凭据建立连接时,服务器将返回一个错误,指示仅域帐户可以连接。

EWS客户端和用户的访问控制
测试或生产服务器管理员可以通过以下方式为连接到EWS的客户端配置访问控制:

  • 通过阻止所有客户端应用程序进行连接。
  • 通过仅允许特定的客户端应用程序进行连接。
  • 通过允许任何客户端应用程序连接,除非明确阻止了这些应用程序。
  • 通过允许任何客户端应用程序进行连接。

应用程序由它们在HTTP Web请求中发送的用户代理字符串标识。

注:应用程序级阻止不是安全功能。用户代理字符串很容易被欺骗。如果允许应用程序访问EWS,则该应用程序仍必须提供服务器进行身份验证的凭据,然后该应用程序才能连接到EWS。

验证EWS托管API的服务器证书

了解如何创建和引用证书验证回调方法,以便可以向Exchange服务器发出EWS托管API请求。

默认情况下,从Exchange 2007 SP1开始的Exchange版本使用自签名X509证书对来自EWS的调用进行身份验证。使用EWS托管API时,您需要创建一个证书验证回调方法。否则,EWS托管API请求将失败。如果您使用的是自动发现服务,则对EWS托管API自动发现方法的调用将失败,并显示AutodiscoverLocalException错误。 如果您使用的是Web生成的Web服务代理,则可能还必须创建验证回调方法,具体取决于创建代理的方式。

创建验证回调方法的前提条件

要设置以验证服务器证书,请确保满足以下条件:

  • 您的Exchange服务器正在使用EWS的自签名证书。如果管理员安装了可追溯到根证书的有效证书,则无需创建验证回调方法
  • 您正在创建一个托管应用程序,其中包括对以下必需的.NET Framework名称空间的引用:
  1. system.Net
  2. System.Net.Security
  3. System.Security.Cryptography.X509Certificates

示例:用于验证EWS托管API的服务器证书的回调方法

以下代码示例演示如何为EWS托管API创建X509证书验证回调方法。此方法将验证X509证书,并且仅在满足以下任一条件时返回true:

  • 该证书有效,并追溯到有效的根证书。
  • 证书有效,并且由返回它的服务器自签名。

重要:本示例中的证书验证回调方法为EWS托管API应用程序的开发和测试提供了足够的安全性。但是,它可能无法为您部署的应用程序提供足够的安全性。您应始终确保使用的证书验证回调方法符合组织的安全要求。

private static bool CertificateValidationCallBack(
         object sender,
         System.Security.Cryptography.X509Certificates.X509Certificate certificate,
         System.Security.Cryptography.X509Certificates.X509Chain chain,
         System.Net.Security.SslPolicyErrors sslPolicyErrors)
    {
      // If the certificate is a valid, signed certificate, return true.
      if (sslPolicyErrors == System.Net.Security.SslPolicyErrors.None)
      {
        return true;
      }
      // If there are errors in the certificate chain, look at each error to determine the cause.
      if ((sslPolicyErrors & System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors) != 0)
      {
        if (chain != null && chain.ChainStatus != null)
        {
          foreach (System.Security.Cryptography.X509Certificates.X509ChainStatus status in chain.ChainStatus)
          {
            if ((certificate.Subject == certificate.Issuer) &&
               (status.Status == System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.UntrustedRoot))
            {
              // Self-signed certificates with an untrusted root are valid. 
              continue;
            }
            else
            {
              if (status.Status != System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.NoError)
              {
                // If there are any other errors in the certificate chain, the certificate is invalid,
             // so the method returns false.
                return false;
              }
            }
          }
        }
        // When processing reaches this line, the only errors in the certificate chain are 
    // untrusted root errors for self-signed certificates. These certificates are valid
    // for default Exchange server installations, so return true.
        return true;
      }
      else
      {
     // In all other cases, return false.
        return false;
      }
    }
View Code

ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallBack;

身份验证

身份验证是Exchange Web Services(EWS)应用程序的关键部分。 Exchange Online,作为Office 365一部分的Exchange Online和从Exchange Server 2013开始的Exchange的本地版本均支持标准的Web身份验证协议,以帮助保护应用程序与Exchange服务器之间的通信。

如果您以Exchange Online为目标,则选择的身份验证方法必须使用HTTPS来加密应用程序发送的请求和响应。尽管您可以将HTTP与Exchange本地服务器一起使用,但是我们建议您对应用程序发送到EWS端点的任何请求使用HTTPS,以帮助保护应用程序和Exchange服务器之间的通信。

Exchange提供了以下身份验证选项供您选择:

  • OAuth 2.0(仅适用于Exchange Online)
  • NTLM(仅本地交换)
  • 基本(不再推荐)

选择的身份验证方法取决于组织的安全要求,使用的是Exchange Online还是Exchange内部部署,以及是否可以访问可以颁发OAuth令牌的第三方提供程序。本文提供的信息将帮助您选择适合您的应用程序的身份验证标准。

设计

开发

归档Archiving

存档邮箱是与用户关联的辅助邮箱。存档邮箱通常用于管理电子邮件存储限制。例如,较旧的电子邮件项目可能会定期从“收件箱”移至存档邮箱。

Exchange Online,作为Office 365一部分的Exchange Online和Exchange Server 2013引入了两个新的Exchange Web Services(EWS)操作,可用于从主邮箱中存档一组邮件项目。 以这种方式归档收件箱项目可以保留项目的文件夹层次结构。 此外,现在可以通过使用文件夹路径指向存档内容的方式,将存档邮箱存储在客户端本地或远程存储,方式对于用户来说几乎是不透明的。

EWS中的归档操作
下表列出了Exchange 2013中引入的存档操作。 

操作名称                             说明    

ArchiveItem                       将项目从主邮箱移动到存档邮箱。

CreateFolderPath            创建一个指向存档邮箱的存储位置的URI。

附件 

通常情况下,附件与电子邮件项目相关联,但实际上,所有 EWS 项目(电子邮件、日历项目、联系人、任务)都可以包含附件。

附件类型

EWS 将附件分类为两个组:文件附件和Item 附件。

  • item附件:强类型的EWS项目,例如电子邮件和日历项目,它们附加到另一个强类型的EWS项目。可以使用EWS托管API或EWS创建的任何强类型项目都可以用作项目附件。项目附件的内容是强类型项目,可轻松访问其所有属性。项目附件可以具有自己的项目附件,因此项目附件的层次结构(或附件的嵌套)是可能的。
  • 文件附件:任何文件,例如.txt,.jpg,.zip,.pdf甚至是.msg文件。 文件附件只有几个属性,其中之一是文件的base-64编码内容。
  • 参考附件:文件提供者引用的任何附件,例如位于云中的文件。 附件可以来自多个提供商。

从项目添加或检索附件时,根据是文件附件还是项目附件,您将以不同的方式进行操作。 例如,要将文件附件添加到项目,只需传递文件的位置即可。 要将现有项目添加为项目附件,您实际上必须将现有项目的属性或MIME内容复制到新项目附件; 您不能只绑定到现有项目。 因此,区分两种类型的附件很重要。 本节中的文章讨论了有关项目附件和文件附件之间差异的更多详细信息。

Email 

Exchange的核心是关于电子邮件。但是,什么使电子邮件成为电子邮件呢?嗯,电子邮件是Exchange中类型最严格的项目之一,这意味着它们甚至在发送之前就包含一组特定的属性。电子邮件由EWS托管API中的EmailMessage类以及EWS中的Message元素及其子元素表示。

在EWS托管API中,EmailMessage对象派生自Item对象。EmailMessage类通过提供其他属性(例如,几乎所有消息传递场景都通用),扩展了Item类,如EmailMessage.Sender和EmailMessage.IsRead。在获取,更新或删除电子邮件时,在大多数情况下,可以使用EmailMessage对象或基础Item对象来完成此操作,具体取决于您使用的属性是在EmailMessageSchema还是ItemSchema类中。item的创建是不同的,因为Item类没有构造函数,因此,在创建电子邮件时,将使用EmailMessage构造函数来创建它,并使用EmailMessage.Save或EmailMessage.SendAndSaveCopy方法来保存或发送它并保存。

使用EWS托管API创建电子邮件

您可以使用EWS托管API Save方法创建电子邮件,如以下示例中的代码所示。 请注意,该示例仅将邮件保存在“草稿”文件夹中,而不发送邮件。 有关如何发送消息或一步创建和发送消息的信息,请参阅在Exchange中使用EWS发送电子邮件。

本示例假定服务是有效的ExchangeService对象,并且用户已通过Exchange服务器的身份验证。

Exchange中EWS中的电子邮件属性和元素

电子邮件具有50多个属性,如果您不知道在哪里查看,则在需要时获得所需的属性可能会造成混淆。 有关使用电子邮件属性和元素的最重要的知识是,每个主要检索方法和操作都返回的一组一流属性和元素中包括哪些属性。 返回的一组第一类属性根据您使用的检索方法而有所不同。 同样重要的是,不要被BaseShape EWS元素的AllProperties值所迷惑,该值与EWS托管API中的BasePropertySet.FirstClassMessageProperties枚举值相对应。 该值实际上并不包括所有属性,而仅包括一流属性。

电子邮件的一流属性和元素
EWS托管API EmailMessage.Bind方法和EWS GetItem操作返回的一组一流属性和元素  与EWS托管API ExchangeService.FindItems方法和EWS FindItem操作 返回的一组一流属性和元素略有不同。

FindItems方法和FindItem操作返回的第一类属性是Bind方法和GetItem操作返回的属性的子集。 

表1列出了Bind方法和GetItem操作返回的所有第一类属性,并指定了FindItems方法或FindItem操作未返回的那些属性。

请注意,您不能扩展FindItems方法或FindItem操作来检索其他属性和元素,例如ToRecipients,CcRecipients和BccRecipients。如果需要检索这些值,请使用FindItems方法或FindItem操作来获取电子邮件的item ID,然后使用Bind方法或GetItem操作来检索所需的属性。

有关显示如何使用Bind或FindItems方法检索项目的代码示例,请参阅使用EWS托管API获取项目。有关显示如何使用GetItem或FindItem操作检索项目的代码示例,请参阅使用EWS获取项目。

下表中列出了一流属性和元素的显示顺序,即它们在响应中的显示顺序。

略...

电子邮件的其他属性和元素

并非所有重要的电子邮件属性和元素都是一流的属性和元素。 要获取其他属性或元素,如果您正在使用EWS托管API,则需要将它们添加到PropertySet中,或者使用属性路径将它们添加到EWS操作调用中。 例如,要检索消息的文本正文和MIME内容,请为Bind或Load方法创建显示的PropertySet:

PropertySet p=new PropertySet(BasePropertySet.IdOnly, ItemSchema.TextBody, ItemSchema.MimeContent);

从EWS托管API ServiceObject对象继承的EmailMessage属性不能包含在Bind方法的属性集中。 但是,所有ServiceObject属性在EmailMessage对象上都是可读的,并且可以通过Bind方法检索。

可能的异常问题

1、A time zone with the specified ID could not be found

将service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);

改为 service = new ExchangeService();   不指定则用最新的版本

2、邮件发送失败

Exchange 2010和2013可以限制用户发送的邮件数量;通过Power Shell命令新建一条策略规则,给recipientratelimit和messageratelimit两个参数赋予一定的值,再给用户应用此规则即可实现限制用户发送量的效果。
参数说明:
messageratelimit:限制用户每分钟可以发送的最大邮件数量,如每分钟内发送的量超过限制,邮件将停留在发件箱,邮件被延迟到下一分钟,并最终被发送成功。
recipientratelimit:限制用户24小时内的发送的最大邮件数量,如发送超过限制,将收到超过限额的NDR退信消息。
注:通讯组(包括动态通讯组)算一个收件人。

参考:Exchange20102013限制用户每分钟与每天发送邮件的数量

原文地址:https://www.cnblogs.com/peterYong/p/13343997.html