在 Exchange 2013 中使用 EWS 展开通讯组
了解如何使用 Exchange 中的 EWS 托管 API 或 EWS 扩展通讯组。
可以使用 ExchangeService.ExpandGroup EWS 托管 API 方法或 ExpandDL EWS 操作扩展通讯组以标识所有收件人。
由于 ExpandGroup 方法已重载,因此可以通过多种方式调用它:
ExpandGroup (String) - 展开由 SMTP 地址标识的组。
ExpandGroup (EmailAddress) - 展开由电子邮件地址标识的组。
ExpandGroup (ItemId) - 展开由组 ID 标识的组。
ExpanGroup (String、String) - 展开由 SMTP 地址和该地址的路由类型标识的组。
使用 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 响应的结构与对扩展通用通讯组的请求的响应相同。