在 Exchange 中使用 EWS 删除附件
了解如何使用 Exchange 中的 EWS 托管 API 或 EWS 从项目中删除附件。
使用 EWS 托管 API 从项中删除文件和项目附件时,有许多选项。 可以从邮件中删除所有附件、按文件名删除或按集合中的位置删除。 对于其中每个选项,都有 一个 AttachmentCollection 方法。
相反,对于 EWS,无论是从项目中删除所有附件还是仅删除一个附件,操作顺序都是相同的。 与 EWS 托管 API 不同,EWS 不包括根据附件数组中的名称或位置删除的单独操作。
表 1. 用于删除附件的 EWS 托管 API 方法和 EWS 操作
任务 | EWS 托管的 API 方法 | EWS 操作 |
---|---|---|
从项目中删除所有附件。 |
Item.Bind,后跟 AttachmentCollection.Clear,后跟 EmailMessage.Update |
GetItem 后跟 DeleteAttachment |
按名称从项目中删除附件。 |
Item.Bind,后跟 AttachmentCollection.Remove,后跟 EmailMessage.Update |
GetItem 后跟 DeleteAttachment |
按集合中的位置从项中删除附件。 |
Item.Bind,后跟 AttachmentCollection.RemoveAt,后跟 EmailMessage.Update |
GetItem 后跟 DeleteAttachment |
使用 EWS 托管 API 从电子邮件中删除所有附件
下面的代码示例演示如何通过以下方式从电子邮件中删除所有附件:
使用 EmailMessage.Bind 方法绑定到现有电子邮件并检索 附件集合。
使用 AttachmentCollection.Clear 方法从电子邮件中删除所有附件。
使用 EmailMessage.Update 方法保存更改。
此示例假定 服务 是有效的 ExchangeService 对象, itemId 是邮件的 ItemId ,将从中删除附件,并且用户已通过 Exchange 服务器身份验证。
public static void DeleteAllAttachments(ExchangeService service, ItemId itemId)
{
// Bind to an existing message by using its item ID and requesting its attachments collection.
// This method results in a GetItem call to EWS.
EmailMessage message = EmailMessage.Bind(service, itemId, new PropertySet(ItemSchema.Attachments));
// Delete all attachments from the message.
message.Attachments.Clear();
// Save the updated message.
// This method results in an DeleteAttachment call to EWS.
message.Update(ConflictResolutionMode.AlwaysOverwrite);
}
使用 EWS 托管 API 从电子邮件中删除按名称的附件
下面的代码示例演示如何按名称删除附件:
使用 EmailMessage.Bind 方法绑定到现有电子邮件并检索 附件集合。
使用 AttachmentCollection.Remove 方法删除名为 FileAttachment.txt 的附件。
使用 EmailMessage.Update 方法保存更改。
此示例假定 服务 是有效的 ExchangeService 对象, itemId 是将从中删除附件的邮件的 ItemId ,并且用户已通过 Exchange 服务器身份验证。
public static void DeleteNamedAttachments(ExchangeService service, ItemId itemId)
{
// Bind to an existing message by using its item ID and requesting its attachments collection.
// This method results in a GetItem call to EWS.
EmailMessage message = EmailMessage.Bind(service, itemId, new PropertySet(ItemSchema.Attachments));
// Iterate through the attachments collection and delete the attachment named "FileAttachment.txt," if it exists.
foreach (Attachment attachment in message.Attachments)
{
if (attachment.Name == "FileAttachment.txt")
{
message.Attachments.Remove(attachment);
break;
}
}
// Save the updated message.
// This method results in an DeleteAttachment call to EWS.
message.Update(ConflictResolutionMode.AlwaysOverwrite);
}
使用 EWS 托管 API 按位置删除附件
下面的代码示例演示如何按位置删除附件:
使用 EmailMessage.Bind 方法绑定到现有电子邮件并检索 Attachments 集合和 EmailMessage.HasAttachments 属性。
使用 AttachmentCollection.Remove 方法删除集合中的第一个附件。
使用 EmailMessage.Update 方法保存更改。
此示例假定 服务 是有效的 ExchangeService 对象, itemId 是将从中删除附件的邮件的 ItemId ,并且用户已通过 Exchange 服务器身份验证。
public static void DeleteAttachmentByPosition(ExchangeService service, ItemId itemId)
{
// Bind to an existing message by using its item ID and requesting the HasAttachments property and the attachments collection.
// This method results in a GetItem call to EWS.
EmailMessage message = EmailMessage.Bind(service, itemId, new PropertySet(EmailMessageSchema.HasAttachments, ItemSchema.Attachments));
// Remove attachments using the zero-based index position of the attachment in the attachments collection.
if (message.HasAttachments)
{
message.Attachments.RemoveAt(0);
}
// Save the updated message.
// This method results in an DeleteAttachment call to EWS.
message.Update(ConflictResolutionMode.AlwaysOverwrite);
}
使用 EWS 从项目中删除附件
若要使用 EWS 删除附件,首先需要检索邮件和附件集合,以确定要删除的 附件的 AttachmentId (GetAttachment 和 DeleteAttachment) 。 有一个或多个 AttachmentId 值要删除后,调用 DeleteAttachment 操作以从邮件中删除指定的附件。
下面的代码示例演示如何使用 GetItem 操作获取电子邮件和邮件附件的集合。 这也是使用 EWS 托管 API 从电子邮件中删除所有附件时,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="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2007_SP1" />
<t:TimeZoneContext>
<t:TimeZoneDefinition Id="Central Standard Time" />
</t:TimeZoneContext>
</soap:Header>
<soap:Body>
<m:GetItem>
<m:ItemShape>
<t:BaseShape>IdOnly</t:BaseShape>
<t:AdditionalProperties>
<t:FieldURI FieldURI="item:Attachments" />
</t:AdditionalProperties>
</m:ItemShape>
<m:ItemIds>
<t:ItemId Id="uqE1AAA=" />
</m:ItemIds>
</m:GetItem>
</soap:Body>
</soap:Envelope>
服务器使用 GetItemResponse 邮件响应 GetItem 请求,该邮件包含 ResponseCode 值 NoError(指示已成功检索电子邮件)和现有附件的 AttachmentId 值。
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo MajorVersion="15"
MinorVersion="0"
MajorBuildNumber="939"
MinorBuildNumber="12"
Version="V2_11"
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:ItemId Id="uqE1AAA="
ChangeKey="CQAAABYAAAAFI5DJmZv+TLtyLOLIF1S5AAAXulcd" />
<t:Attachments>
<t:FileAttachment>
<t:AttachmentId Id="IpHLObE=" />
<t:Name>FileAttachment.txt</t:Name>
</t:FileAttachment>
<t:FileAttachment>
<t:AttachmentId Id="QuHSSmY=" />
<t:Name>SecondAttachment.txt</t:Name>
</t:FileAttachment>
<t:FileAttachment>
<t:AttachmentId Id="qf2KoPo=" />
<t:Name>ThirdAttachment.jpg</t:Name>
</t:FileAttachment>
<t:FileAttachment>
<t:AttachmentId Id="NFQMnMc=" />
<t:Name>FourthAttachment.txt</t:Name>
</t:FileAttachment>
<t:ItemAttachment>
<t:AttachmentId Id="jJvbLXQ=" />
<t:Name>Attached Message Item</t:Name>
</t:ItemAttachment>
</t:Attachments>
</t:Message>
</m:Items>
</m:GetItemResponseMessage>
</m:ResponseMessages>
</m:GetItemResponse>
</s:Body>
</s:Envelope>
确定要删除的附件后,调用 DeleteAttachment 操作并包括要删除的附件的 AttachmentId 值。
<?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="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2007_SP1" />
<t:TimeZoneContext>
<t:TimeZoneDefinition Id="Central Standard Time" />
</t:TimeZoneContext>
</soap:Header>
<soap:Body>
<m:DeleteAttachment>
<m:AttachmentIds>
<t:AttachmentId Id="IpHLObE=" />
<t:AttachmentId Id="QuHSSmY=" />
<t:AttachmentId Id="qf2KoPo=" />
<t:AttachmentId Id="NFQMnMc=" />
<t:AttachmentId Id="jJvbLXQ=" />
</m:AttachmentIds>
</m:DeleteAttachment>
</soap:Body>
</soap:Envelope>
服务器使用 DeleteAttachmentResponse 消息响应 DeleteAttachment 请求,其中包含每个 DeleteAttachmentResponseMessage 的 ResponseCode 值 NoError,指示已成功删除每个附件。 为了提高可读性,会缩短某些属性的值。
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo MajorVersion="15"
MinorVersion="0"
MajorBuildNumber="939"
MinorBuildNumber="12"
Version="V2_11"
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:DeleteAttachmentResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:DeleteAttachmentResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:RootItemId RootItemId="uqE1AAA=" RootItemChangeKey="AAAXulck" />
</m:DeleteAttachmentResponseMessage>
<m:DeleteAttachmentResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:RootItemId RootItemId="uqE1AAA=" RootItemChangeKey="AAAXulck" />
</m:DeleteAttachmentResponseMessage>
<m:DeleteAttachmentResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:RootItemId RootItemId="uqE1AAA=" RootItemChangeKey="AAAXulck" />
</m:DeleteAttachmentResponseMessage>
<m:DeleteAttachmentResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:RootItemId RootItemId="uqE1AAA=" RootItemChangeKey="AAAXulck" />
</m:DeleteAttachmentResponseMessage>
<m:DeleteAttachmentResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:RootItemId RootItemId="uqE1AAA=" RootItemChangeKey="AAAXulck" />
</m:DeleteAttachmentResponseMessage>
</m:ResponseMessages>
</m:DeleteAttachmentResponse>
</s:Body>
</s:Envelope>