在 Exchange 2013 中使用 EWS 展开通讯组

了解如何使用 Exchange 中的 EWS 托管 API 或 EWS 扩展通讯组。

可以使用 ExchangeService.ExpandGroup EWS 托管 API 方法或 ExpandDL EWS 操作扩展通讯组以标识所有收件人。

由于 ExpandGroup 方法已重载,因此可以通过多种方式调用它:

使用 EWS 托管 API 扩展通用通讯组或安全组

以下示例演示如何使用电子邮件地址扩展通用通讯组或安全组,这是最简单的方法。 此示例假定 service 是有效的 ExchangeService 对象,且用户已通过 Exchange 服务器的身份验证。

// Return the expanded group.
   ExpandGroupResults myGroupMembers = service.ExpandGroup("employees@contoso.com");
// Display the group members.
   foreach (EmailAddress address in myGroupMembers.Members)
   {
      Console.WriteLine("Email Address: {0}", address);
   }

这不是很多代码,但它也是相当基本的,可能不会提供你要查找的内容。 因此,让我们更进一步。 通讯组还可以包含其他通讯组。 只需展开它,就会输出包含的通讯组的电子邮件地址,但不会展开它们。 通过再添加几行代码,可以递归扩展组以输出每个联系人。

private static void ExpandDistributionLists(ExchangeService service, string Mailbox)
{
   // Return the expanded group.
      ExpandGroupResults myGroupMembers = service.ExpandGroup(Mailbox);
   // Display the group members.
      foreach (EmailAddress address in myGroupMembers.Members)
      {
         // Check to see if the mailbox is a public group
         if (address.MailboxType == MailboxType.PublicGroup)
      {
         // Call the function again to expand the contained
         // distribution group.
         ExpandDistributionLists(service, address.Address);
      }
      else
      {
         // Output the address of the mailbox.
         Console.WriteLine("Email Address: {0}", address);
      }
   }
}

现在,你可以在代码中调用此新函数,并展开第一个分发组中包含的所有公共通讯组。

ExpandDistributionLists(service, "employees@contoso.com");

使用 EWS 托管 API 展开联系人组

由于联系人组没有关联的电子邮件地址,因此需要使用 ExpandGroup ( ItemId) 方法根据 ItemId 展开组。 可以创建一个函数(如上一示例所示),并将第二个参数类型从字符串更改为 ItemId

private static void ExpandContactGroup(ExchangeService service, ItemId groupID)
{
   // Return the expanded group.
      ExpandGroupResults myGroupMembers = service.ExpandGroup(groupID);
   // Display the group members.
      foreach (EmailAddress address in myGroupMembers.Members)
      {
         if (address.MailboxType == MailboxType.PublicGroup)
         {
            ExpandDistributionLists(service, address.Address);
         }
         else
         {
            Console.WriteLine("Email Address: {0}", address);
         }
      }
}

现在,可以使用 Exchange 服务对象和联系人组的 ItemId 调用此函数。 请注意,为了提高可读性,示例中的 ItemId 已缩短。

ExpandContactGroup(service, new ItemId("AAMkADBlY…");

使用 EWS 展开通用通讯组或安全组

以下示例显示了使用 ExpandDL 操作时从客户端发送到服务器的 XML 请求消息。 这也是使用 EWS 托管 API 扩展通用通讯组时 EWS 托管 API 发送的 XML 请求。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"
               xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
  <soap:Body>
    <ExpandDL xmlns="http://schemas.microsoft.com/exchange/services/2006/messages"
              xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
      <Mailbox>
        <t:EmailAddress>employees@contoso.com</t:EmailAddress>
      </Mailbox>
    </ExpandDL>
  </soap:Body>
</soap:Envelope>

以下示例显示从服务器发送到客户端的 XML 响应消息。 请注意,将同时返回邮箱和通用通讯组。

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ExpandDLResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                      xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ResponseMessages xmlns="http://schemas.microsoft.com/exchange/services/2006/messages">
    <ExpandDLResponseMessage ResponseClass="Success">
      <ResponseCode>NoError</ResponseCode>
      <DLExpansion IncludesLastItemInRange="true" TotalItemsInView="4">
        <Mailbox xmlns="http://schemas.microsoft.com/exchange/services/2006/types">
          <Name>Sadie Daniels</Name>
          <EmailAddress>sadie@contoso.com</EmailAddress>
          <RoutingType>SMTP</RoutingType>
          <MailboxType>Mailbox</MailboxType>
        </Mailbox>
        <Mailbox xmlns="http://schemas.microsoft.com/exchange/services/2006/types">
          <Name>Alfred Welker</Name>
          <EmailAddress>alfred@contoso.com</EmailAddress>
          <RoutingType>SMTP</RoutingType>
          <MailboxType>Mailbox</MailboxType>
        </Mailbox>
        <Mailbox xmlns="http://schemas.microsoft.com/exchange/services/2006/types">
          <Name>Contoso Sales</Name>
          <EmailAddress>sales@contoso.com</EmailAddress>
          <RoutingType>SMTP</RoutingType>
          <MailboxType>PublicDL</MailboxType>
        </Mailbox>
        <Mailbox xmlns="http://schemas.microsoft.com/exchange/services/2006/types">
          <Name>Contoso Support</Name>
          <EmailAddress>support@contoso.com</EmailAddress>
          <RoutingType>SMTP</RoutingType>
          <MailboxType>PublicDL</MailboxType>
        </Mailbox>
      </DLExpansion>
    </ExpandDLResponseMessage>
  </ResponseMessages>
</ExpandDLResponse>
</s:Body>
</s:Envelope>

与使用 EWS 托管 API 不同,使用 EWS 扩展通用通讯组时,无法递归扩展返回的通讯组。 需要发送其他请求来扩展响应中包含的每个通讯组。

使用 EWS 展开联系人组

展开联系人组的 XML 请求类似于展开通讯组的请求。 使用联系人组的 ItemId ,而不是电子邮件地址。 为了提高可读性,本示例中的 ItemId 已缩短。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"
               xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
  <soap:Body>
    <ExpandDL xmlns="http://schemas.microsoft.com/exchange/services/2006/messages"
              xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
      <Mailbox>
         <ItemId xmlns="http://schemas.microsoft.com/exchange/services/2006/types" Id="AAMkADBlY…" />
      </Mailbox>
    </ExpandDL>
  </soap:Body>
</soap:Envelope>

对扩展联系人组的请求的 XML 响应的结构与对扩展通用通讯组的请求的响应相同。

另请参阅