通过使用 Exchange 中的 EWS 删除项目

了解如何使用 Exchange 中的 EWS 托管 API 或 EWS 导入约会、电子邮件、联系人、任务和其他项目。

许多系统包含约会、电子邮件、联系人和任务,您可以通过多种不同的方式将这些项目导入 Exchange。 如果未在这些项目上维护邮箱关系,则将项目导入 Exchange 非常简单。 可以使用 Item.Save EWS 托管 API 方法或 CreateItem EWS 操作在 Exchange 邮箱中创建项目。 但是,简单方法并不支持所有方案:例如:

  • 导入与会者的约会 (会议) 时,无法维护组织者和与会者之间的关系。 这意味着会议组织者需要向与会者重新发送会议邀请,以便重新建立组织者与与会者之间的关系。 如果约会已导入与会者的日历,则约会将与会议组织者的约会无关。 与会者需要接受组织者的重新发送会议邀请才能重新建立组织者与与会者的关系。

  • 导入分配的任务时,不会保留有关被分配者的信息。

所有导入选项都可用于将项目批量导入 Exchange。

使用 EWS 托管 API 或 EWS 项类型导入项

可以使用 EWS 托管 API 或 EWS 从其他系统导入电子邮件、联系人、约会或任务。 只需在以下任何对象上设置源格式 中的属性 ,具体取决于要导入的内容。

表 1. EWS 托管 API 对象和 EWS 元素

EWS 托管 API 对象 EWS 元素
EmailMessage
邮件
联系人
联系人
约会
CalendarItem
任务
任务

使用 Item.Save EWS 托管 API 方法或 CreateItem EWS 操作执行项导入。 建议在从其他系统导入项时使用此方法,因为可以控制导入哪些属性。 有关如何设置项的属性并保存项的详细信息,请参阅 使用 EWS 托管 API 创建项 或使用 EWS 创建项

以完全保真度导入项

可以使用 UploadItems EWS 操作将项目作为数据流上传。 项的此数据流表示形式必须来自 ExportItems 操作调用的结果。 由于 EWS 托管 API 不实现 UploadItems 操作,因此如果使用 EWS 托管 API,则需要编写例程来发送 Web 请求。

这是导入已从另一个 Exchange 服务器导出的项目的最简单方法。

在以下示例中,为了提高可读性,将缩短标识符和 Data 元素内容。

<?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="https://schemas.xmlsoap.org/soap/envelope/"
      xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
      xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013_SP1"/>
  </soap:Header>
  <soap:Body>
    <m:UploadItems>
      <m:Items>
        <t:Item CreateAction="CreateNew">
          <t:ParentFolderId  Id="AAMkADEzOTE7kV0AAA=" ChangeKey="AQAAAA=="/>
          <t:Data>AQAAAAgAAAAAAQAAAAADABZADQASDkANABMO</t:Data>
        </t:Item>
      </m:Items>
    </m:UploadItems>
  </soap:Body>
</soap:Envelope>

服务器使用 UploadItemsResponse 元素响应 UploadItems 请求,该元素包含 NoError的 ResponseCode 元素值,该值指示已成功上传该项目。 响应还包括已上传项的项 ID。

使用 MIME 流从常见文件格式导入

EWS 可以导入 EML (.eml) 和 iCal (.ics) 文件。 你需要测试 MIME 内容,了解 Exchange MIME 分析程序如何处理 MIME 流的内容。 虽然使用 MIME 流很方便,但通常最好 使用 EWS 托管 API 或 EWS 项类型来导入项。 下面是如何 导入 vCard 的示例。

使用 EWS 托管 API 通过 MIME 流从 EML 文件导入电子邮件

以下示例演示如何使用 EML 文件的内容设置 MimeContent 属性,然后将电子邮件导入邮箱。 此示例还演示如何在导入的电子邮件上设置 PidTagMessageFlags (0x0E07) extended 属性,使其不会在邮箱中显示为草稿项目。 此示例假定 服务 是有效的 ExchangeService 对象,并且用户可以向 Exchange 服务器进行身份验证。

private static void UploadMIMEEmail(ExchangeService service)
{
    EmailMessage email = new EmailMessage(service);
    
    string emlFileName = @"C:\import\email.eml";
    using (FileStream fs = new FileStream(emlFileName, FileMode.Open, FileAccess.Read))
    {
        byte[] bytes = new byte[fs.Length];
        int numBytesToRead = (int)fs.Length;
        int numBytesRead = 0;
        while (numBytesToRead > 0)
        {
            int n = fs.Read(bytes, numBytesRead, numBytesToRead);
            if (n == 0)
                break;
            numBytesRead += n;
            numBytesToRead -= n;
        }
        // Set the contents of the .eml file to the MimeContent property.
        email.MimeContent = new MimeContent("UTF-8", bytes);
    }
    
    // Indicate that this email is not a draft. Otherwise, the email will appear as a 
    // draft to clients.
    ExtendedPropertyDefinition PR_MESSAGE_FLAGS_msgflag_read = new ExtendedPropertyDefinition(3591, MapiPropertyType.Integer);
    email.SetExtendedProperty(PR_MESSAGE_FLAGS_msgflag_read, 1);
    // This results in a CreateItem call to EWS. The email will be saved in the Inbox folder.
    email.Save(WellKnownFolderName.Inbox);
}

使用 EWS 托管 API 通过 MIME 流从 iCal 文件导入约会

可以使用 MIME 流以 iCalendar 文件的形式导入简单约会。 无法导入会议,即与与会者的约会,因为必须将会议组织者和与会者之间的关系设置为 Exchange 日历 工作流的一部分。 无法在 MIME 流中捕获与会者。

下面的代码示例演示如何将简单的 .ics 文件导入用户邮箱。

private static void UploadMIMEAppointment(ExchangeService service)
{
    Appointment appointment = new Appointment(service);
    string iCalFileName = @"C:\import\appointment.ics";
    using (FileStream fs = new FileStream(iCalFileName, FileMode.Open, FileAccess.Read))
    {
        byte[] bytes = new byte[fs.Length];
        int numBytesToRead = (int)fs.Length;
        int numBytesRead = 0;
        while (numBytesToRead > 0)
        {
            int n = fs.Read(bytes, numBytesRead, numBytesToRead);
            if (n == 0)
                break;
            numBytesRead += n;
            numBytesToRead -= n;
        }
        // Set the contents of the .ics file to the MimeContent property.
        appointment.MimeContent = new MimeContent("UTF-8", bytes);
    }
    // This results in a CreateItem call to EWS. 
    appointment.Save(WellKnownFolderName.Calendar);
}

使用 EWS 通过 MIME 流导入项

可以使用 CreateItem EWS 操作通过 MIME 流导入 EML 和 iCal 项。

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"
               xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
               xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013_SP1" />
    <t:MailboxCulture>en-US</t:MailboxCulture>
  </soap:Header>
  <soap:Body >
    <m:CreateItem>
      <m:SavedItemFolderId>
        <t:DistinguishedFolderId Id="inbox"/>
      </m:SavedItemFolderId> 
        <m:Items>
        <t:Message>
          <t:MimeContent CharacterSet="UTF-8">
            <!-- Insert MIME content here-->
          </t:MimeContent>
        </t:Message>
      </m:Items>
    </m:CreateItem>
  </soap:Body>
</soap:Envelope>

后续步骤

将项目导入邮箱后,可能需要 创建自定义文件夹来存储导入的项目,或 同步客户端和邮箱项目

另请参阅