使用 Exchange 中的 EWS 移动和复制电子邮件

了解如何在 Exchange 中使用 EWS 托管 API 或 EWS 移动和复制电子邮件。

可以使用 EWS 托管 API 或 EWS 移动和复制邮箱中的电子邮件。

表 1. 用于移动和复制电子邮件的 EWS 托管 API 方法和 EWS 操作

任务 EWS 托管的 API 方法 EWS 操作
移动电子邮件
EmailMessage.Move
MoveItem
复制电子邮件
EmailMessage.Copy
CopyItem

请务必注意,将电子邮件移动或复制到其他文件夹中时,新文件夹中会创建一个具有唯一项目 ID 的新项目,并且原始邮件将被删除。 如果要在同一邮箱中的两个文件夹之间移动或复制电子邮件,响应中将返回新项目,这样您便可以访问新项目 ID。 但是,如果要在两个邮箱之间或邮箱与公用文件夹之间移动或复制电子邮件,响应中不会返回新项目。 若要访问该方案中移动的消息,请使用 EWS 托管 API FindItems 方法或 EWS FindItem 操作,为 PidTagSearchKey (0x300B0102) 属性创建扩展属性定义,或创建并设置自定义扩展属性,然后在新文件夹中搜索自定义扩展属性。

删除电子邮件与将项目移动到“已删除邮件”文件夹不同。 如果使用 EWS 托管 API Item.Delete 方法或 EWS DeleteItem 操作,则会从原始文件夹中删除请求中指定的项,并在“已删除邮件”文件夹中放置一个具有新项目 ID 的副本。 与移动或复制任何项不同, Delete 方法或 DeleteItem 操作响应中不会返回新项。 使用 EWS 托管 API 或 EWS 删除电子邮件所涉及的步骤与从 Exchange 存储中删除任何通用项的步骤相同。

使用 EWS 托管 API 移动电子邮件

下面的代码示例演示如何使用 EmailMessage.Move 方法将现有电子邮件从一个文件夹移动到另一个文件夹。

此示例假定 服务 是有效的 ExchangeService 对象, ItemId 是要移动或复制的电子邮件的 ID

// As a best practice, limit the properties returned by the Bind method to only those that are required.
PropertySet propSet = new PropertySet(BasePropertySet.IdOnly, EmailMessageSchema.Subject, EmailMessageSchema.ParentFolderId);
// Bind to the existing item by using the ItemId.
// This method call results in a GetItem call to EWS.
EmailMessage beforeMessage = EmailMessage.Bind(service, ItemId, propSet);
// Move the specified mail to the JunkEmail folder and store the returned item.
Item item = beforeMessage.Move(WellKnownFolderName.JunkEmail);
// Check that the item was moved by binding to the moved email message 
// and retrieving the new ParentFolderId.
// This method call results in a GetItem call to EWS.
EmailMessage movedMessage = EmailMessage.Bind(service, item.Id, propSet);
Console.WriteLine("An email message with the subject '" + beforeMessage.Subject + "' has been moved from the '" + beforeMessage.ParentFolderId + "' folder to the '" + movedMessage.ParentFolderId + "' folder.");

使用 EWS 移动电子邮件

下面的代码示例演示如何使用 MoveItem 操作将电子邮件移动到“垃圾邮件Email”文件夹。

这也是调用 Move 方法时由 EWS 托管 API 发送的 XML 请求。 为了方便读取,已缩短一些属性和元素的值。

<?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:MoveItem>
      <m:ToFolderId>
        <t:DistinguishedFolderId Id="junkemail" />
      </m:ToFolderId>
      <m:ItemIds>
        <t:ItemId Id="AfwDoAAA="
                  ChangeKey="CQAAABYAAAApjGm7TnMWQ5TzjbhziLL0AAF25sM1" />
      </m:ItemIds>
    </m:MoveItem>
  </soap:Body>
</soap:Envelope>

服务器使用 MoveItemResponse 邮件响应 MoveItem 请求,该邮件包含 ResponseCodeNoError,指示电子邮件已成功移动。 响应还包括新文件夹中电子邮件的 ItemId ,这一点很重要,因为 ItemId 在新文件夹中是不同的。

使用 EWS 托管 API 复制电子邮件

下面的代码示例演示如何使用 EmailMessage.Copy 方法将现有电子邮件从一个文件夹复制到另一个文件夹。

此示例假定 服务 是有效的 ExchangeService 对象, ItemId 是要复制的电子邮件的 ID 。 为了提高可读性,某些参数的值已缩短。

// As a best practice, limit the properties returned by the Bind method to only those that are required.
PropertySet propSet = new PropertySet(BasePropertySet.IdOnly, EmailMessageSchema.Subject, EmailMessageSchema.ParentFolderId);
// Bind to the existing item by using the ItemId.
// This method call results in a GetItem call to EWS.
EmailMessage originalMessage = EmailMessage.Bind(service, ItemId, propSet);
// Copy the orignal message into another folder in the mailbox and store the returned item.
Item item = originalMessage.Copy("epQ/3AAA=");
// Check that the item was copied by binding to the copied email message 
// and retrieving the new ParentFolderId.
// This method call results in a GetItem call to EWS.
EmailMessage copiedMessage = EmailMessage.Bind(service, item.Id, propSet);
Console.WriteLine("An email message with the subject '" + originalMessage.Subject + "' has been copied from the '" + originalMessage.ParentFolderId + "' folder to the '" + copiedMessage.ParentFolderId + "' folder.");

使用 EWS 复制电子邮件

下面的代码示例演示如何使用 CopyItem 操作通过发送要移动的电子邮件的 ItemId 并在 ToFolderId 元素中指定目标文件夹,将电子邮件复制到同一邮箱中的不同文件夹。

这也是调用 Copy 方法时由 EWS 托管 API 发送的 XML 请求。 为了方便读取,已缩短一些属性和元素的值。

<?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:CopyItem>
      <m:ToFolderId>
        <t:FolderId Id="pQ/3AAA=" />
      </m:ToFolderId>
      <m:ItemIds>
        <t:ItemId Id="2TSeSAAA="
                  ChangeKey="CQAAABYAAAApjGm7TnMWQ5TzjbhziLL0AAF2d+3+" />
      </m:ItemIds>
    </m:CopyItem>
  </soap:Body>
</soap:Envelope>

服务器使用 CopyItemResponse 邮件响应 CopyItem 请求,该邮件包含 ResponseCodeNoError,该值指示已成功复制电子邮件。 响应还包括新文件夹中电子邮件的 ItemId ,这一点很重要,因为 ItemId 在新文件夹中是不同的。

另请参阅