通过在 Exchange 中使用 EWS 导出项目
了解如何通过使用 EWS 托管 API 或 Exchange 中的 EWS 导出约会、电子邮件、联系人、任务和其他项目。
可以通过使用 EWS 托管 API 或 EWS 以多种不同的方式从 Exchange 导出项目。 你使用的选项取决于:
导出的项类型。
希望在 Exchange 中的项状态和导出的项之间保持的保真度。
导出项的格式。
任何后期处理要求。
是否要将项目导入 Exchange。
本文介绍如何使用每个不同的选项导出项。 可以使用任何选项从 Exchange 批量导出项。
将项导出为自定义格式
可以使用 Item.Bind EWS 托管 API 方法调用结果,或将 GetItem EWS 操作的结果分析为符合应用程序要求的格式。 导出项以将其导入数据库、.csv 文件或其他格式或系统时,请使用此选项。 你甚至可以以项 EWS XML 的形式保存项,这可能很有用,因为许多系统都具有 XML 分析功能。 建议使用 Item.Bind 方法或 GetItem 操作 (不具有 Item.MimeContent 属性),因为此选项允许你控制要导出的属性。
以完全保真的方式导出项目
若要以完全保真的方式导出项目,可以使用 ExportItems EWS 操作。 ExportItems 操作将每个项导出为数据流。 此数据流不用于分析,但可用作可导入回 Exchange 邮箱中的项级备份。 可以在每个 ExportItems 请求中包含许多项,但建议每次的调用中包含不超过 100 个项目。 由于 EWS 托管 API 未实现 ExportItems 操作,因此,如果使用 EWS 托管 API,则需要编写一个例程来发送 Web 请求。 可以选择使用 Item.Bind 方法获取有关项的元数据,以便可以为相关数据流的信息编制索引和存储信息。
建议使用 ExportItems 操作导出计划导入到 Exchange 邮箱中的项目。
以下示例演示了如何使用 ExportItems 操作。 在此示例中,为了便于阅读,已缩短项标识符。
<?xml version="1.0" encoding="utf-8" ?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages">
<soap:Header>
<t:RequestServerVersion Version="Exchange2013"/>
</soap:Header>
<soap:Body>
<m:ExportItems>
<m:ItemIds>
<t:ItemId Id="AAMkAGYzZjZmRiUsidkC+NAAAAY89GAAA="/>
</m:ItemIds>
</m:ExportItems>
</soap:Body>
</soap:Envelope>
服务器使用 ExportItemsResponse 元素来响应 ExportItems 请求,其中包含 NoError 的 ResponseCode 元素值,指示已成功导出项。 响应还包括导出项的项 ID 和包含导出内容的数据流。 下面的示例演示了包含导出项的 SOAP 主体。
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:ExportItemsResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:ExportItemsResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:ItemId Id="AAMkAGYzZjZmRiUsidkC+NAAAAY89GAAA=" ChangeKey="FwAAAA=="/>
<m:Data>
AQAAAAgAAAAAAAAALgBlAHgAdABlAHMAdAAuAG0AaQBjAHIAbwBzAG8AZgB0AC4A
cgAyAEAAYQB1AGoAaQBuAGcALQBkAG8AbQAuAGUAeAB0AGUAcwB0AC4AbQBpAGMAcgBvAHMA
bwBmAHQALgBjAG8AbQAAAAMAADkAAAAAAwD+DwYAAAADAARAAwACQAMADkA=
</m:Data>
</m:ExportItemsResponseMessage>
</m:ResponseMessages>
</m:ExportItemsResponse>
</s:Body>
使用 MIME 流导出为通用文件格式
可以使用 Item.Bind EWS 托管 API 方法或 GetItem EWS 操作来获取项的 MIME 表示形式。 由于 Exchange 不存储每个项的 MIME 内容,因此必须将每个项的数据库表示形式转换为 MIME 流。 由于此转换成本高昂,因此不建议为大规模项请求 MIME 流。 还要注意的是,MIME 流包含一组有限的属性; 如果属性集不包含所需属性,则可能需要考虑其他选项。
使用 EWS 托管 API 通过使用 MIME 流将电子邮件导出到 .eml 和 .mht 文件
Outlook 和其他常见电子邮件应用程序可以打开 EML (.eml) 文件格式。 以下示例演示了如何通过使用 MIME 流导出电子邮件,以及如何使用 MIME 流创建 EML 和 MIME HTML (.mht) 文件。 许多 Web 浏览器支持 MIME HTML 文件格式。 此示例假定 服务 是有效的 ExchangeService 对象,并且用户可以向 Exchange 服务器进行身份验证。
private static void ExportMIMEEmail(ExchangeService service)
{
Folder inbox = Folder.Bind(service, WellKnownFolderName.Inbox);
ItemView view = new ItemView(1);
view.PropertySet = new PropertySet(BasePropertySet.IdOnly);
// This results in a FindItem call to EWS.
FindItemsResults<Item> results = inbox.FindItems(view);
foreach (var item in results)
{
PropertySet props = new PropertySet(EmailMessageSchema.MimeContent);
// This results in a GetItem call to EWS.
var email = EmailMessage.Bind(service, item.Id, props);
string emlFileName = @"C:\export\email.eml";
string mhtFileName = @"C:\export\email.mht";
// Save as .eml.
using (FileStream fs = new FileStream(emlFileName, FileMode.Create, FileAccess.Write))
{
fs.Write(email.MimeContent.Content, 0, email.MimeContent.Content.Length);
}
// Save as .mht.
using (FileStream fs = new FileStream(mhtFileName, FileMode.Create, FileAccess.Write))
{
fs.Write(email.MimeContent.Content, 0, email.MimeContent.Content.Length);
}
}
}
使用 EWS 托管 API 通过使用 MIME 流将约会导出到 iCal 文件
Outlook 和其他常见日历应用程序可以打开 iCal 文件格式。 以下示例演示了如何通过使用 MIME 流导出约会,以及如何使用 MIME 流创建 iCal 文件。 请注意,许多属性不会随 MIME 流一起导出,包括与会者和附件相关的属性。 可以通过请求 EWS 中的其他属性将其捕获,并将其作为专用扩展保存在 iCal 文件中。 这些专用扩展以“x-”为前缀。
此示例假定 服务 是有效的 ExchangeService 对象,并且用户可以向 Exchange 服务器进行身份验证。 此示例还假设在日历文件夹里有一个主题为“2015 年财务预测”的约会。
private static void ExportMIMEAppointment(ExchangeService service)
{
Folder inbox = Folder.Bind(service, WellKnownFolderName.Calendar);
ItemView view = new ItemView(1);
view.PropertySet = new PropertySet(BasePropertySet.IdOnly);
// This results in a FindItem call to EWS.
FindItemsResults<Item> results = inbox.FindItems("subject:'2015 Financial Projections'", view);
foreach (var item in results)
{
PropertySet props = new PropertySet(AppointmentSchema.MimeContent);
// This results in a GetItem call to EWS.
var email = Appointment.Bind(service, item.Id, props);
string iCalFileName = @"C:\export\appointment.ics";
// Save as .ics.
using (FileStream fs = new FileStream(iCalFileName, FileMode.Create, FileAccess.Write))
{
fs.Write(email.MimeContent.Content, 0, email.MimeContent.Content.Length);
}
}
}
使用 EWS 托管 API 通过使用 MIME 流将联系人导出到 vCard 文件中
Outlook 和其他常见的联系人管理应用程序可以打开 vCard (.vcf) 文件格式。 以下示例演示了如何通过使用 MIME 流导出联系人,以及如何使用 MIME 流创建 vCard。 可以通过请求 EWS 中的其他属性将其捕获,并将其保存在 。 vCard 作为专用扩展。 这些扩展以“x-”为前缀。
此示例假定 服务 是有效的 ExchangeService 对象,并且用户可以向 Exchange 服务器进行身份验证。
private static void ExportMIMEContact(ExchangeService service)
{
Folder inbox = Folder.Bind(service, WellKnownFolderName.Contacts);
ItemView view = new ItemView(1);
view.PropertySet = new PropertySet(BasePropertySet.IdOnly);
// This results in a FindItem call to EWS.
FindItemsResults<Item> results = inbox.FindItems(view);
foreach (var item in results)
{
PropertySet props = new PropertySet(ContactSchema.MimeContent);
// This results in a GetItem call to EWS.
var email = Contact.Bind(service, item.Id, props);
string vcfFileName = @"C:\export\contact.vcf";
// Save as .vcf.
using (FileStream fs = new FileStream(vcfFileName, FileMode.Create, FileAccess.Write))
{
fs.Write(email.MimeContent.Content, 0, email.MimeContent.Content.Length);
}
}
}
注意
不能通过使用 MimeContent 属性导入 vCard 文件。 可以使用 Contact.Save EWS 托管 API 方法或 CreateItem EWS 操作导入联系人。
使用 EWS 通过使用 MIME 流导出任何项
使用 GetItem 操作获取项的 MIME 流。 以下 GetItem 请求演示了如何请求项的 MIME 内容。
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2013" />
</soap:Header>
<soap:Body>
<m:GetItem>
<m:ItemShape>
<t:BaseShape>IdOnly</t:BaseShape>
<t:IncludeMimeContent>true</t:IncludeMimeContent>
</m:ItemShape>
<m:ItemIds>
<t:ItemId Id="AAMkADEzYjJkLTYxMwB8GqYicWAAA=" ChangeKey="CQAAABzXv"/>
</m:ItemIds>
</m:GetItem>
</soap:Body>
</soap:Envelope>
下面的示例演示了对获取 MIME 流请求的响应。 为了便于阅读,已缩短 MIME 流。
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo MajorVersion="15"
MinorVersion="0"
MajorBuildNumber="893"
MinorBuildNumber="17"
Version="V2_10"
xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:GetItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Items>
<t:Message>
<t:MimeContent CharacterSet="UTF-8">UmVjZ6IGZyb2b2suY29y5hMzgwZTA1YtDQo=</t:MimeContent>
<t:ItemId Id="AAMkADEzYjJkLTYxMwB8GqYicWAAA=" ChangeKey="CQAAABzXv"/>
</t:Message>
</m:Items>
</m:GetItemResponseMessage>
</m:ResponseMessages>
</m:GetItemResponse>
</s:Body>
</s:Envelope>
导出项目后,可能需要 将项目导入 Exchange。