Получение вложений с помощью EWS в Exchange
Узнайте, как получить вложения из элементов EWS с помощью управляемого API EWS или протокола EWS в Exchange.
Вложения из элемента можно получить с помощью управляемого API EWS или EWS. Так как начальный вызов для получения элемента включает только метаданные о коллекции вложений элемента, извлечение вложений всегда является двухфакторным процессом. Сначала получите элемент . Затем получите вложение.
Таблица 1. Методы управляемого API EWS и операции EWS для добавления вложений
Задача | Метод управляемого API EWS | Операция служб EWS |
---|---|---|
Получение вложений элемента |
Item.Bind и ItemAttachment.Load |
GetItem и GetAttachment |
Получение файловых вложений |
Item.Bind и FileAttachment.Load |
GetItem и GetAttachment |
Извлечение вложений из электронного письма с помощью управляемого API EWS
Приведенный ниже пример кода демонстрирует способ извлечения объекта EmailMessage с помощью метода Bind, выполнения итерации через коллекцию вложений и вызова метода FileAttachment.Load или ItemAttachment.Load для каждого вложения при необходимости. Каждое вложение файла сохраняется в папку C:\temp\, а каждое вложение элемента загружается в память. Дополнительные сведения о сохранении вложения элемента см. в разделе Сохранение вложенной почты с помощью управляемого API EWS.
В этом примере предполагается, что service является допустимым объектом ExchangeService, что itemId является классом ItemId сообщения, из которого будут извлекаться вложения, а также что пользователь прошел проверку подлинности на сервере Exchange.
public static void GetAttachmentsFromEmail(ExchangeService service, ItemId itemId)
{
// Bind to an existing message item and retrieve the attachments collection.
// This method results in an GetItem call to EWS.
EmailMessage message = EmailMessage.Bind(service, itemId, new PropertySet(ItemSchema.Attachments));
// Iterate through the attachments collection and load each attachment.
foreach (Attachment attachment in message.Attachments)
{
if (attachment is FileAttachment)
{
FileAttachment fileAttachment = attachment as FileAttachment;
// Load the attachment into a file.
// This call results in a GetAttachment call to EWS.
fileAttachment.Load("C:\\temp\\" + fileAttachment.Name);
Console.WriteLine("File attachment name: " + fileAttachment.Name);
}
else // Attachment is an item attachment.
{
ItemAttachment itemAttachment = attachment as ItemAttachment;
// Load attachment into memory and write out the subject.
// This does not save the file like it does with a file attachment.
// This call results in a GetAttachment call to EWS.
itemAttachment.Load();
Console.WriteLine("Item attachment name: " + itemAttachment.Name);
}
}
}
Извлечение вложения из электронного письма с помощью EWS
Для извлечения вложения с помощью EWS сперва нужно извлечь сообщение и коллекцию вложений, чтобы получить элемент Идентификатора вложения AttachmentId (GetAttachment и DeleteAttachment) вложения, которое необходимо извлечь. Получив одно или несколько значений AttachmentId для извлечения, вызовите операцию GetAttachment, чтобы загрузить все свойства вложения.
В следующем примере кода показано, как использовать операцию GetItem для получения сообщения электронной почты и коллекции вложений сообщения. Кроме того, этот код представляет собой первый XML-запрос, посылаемый управляемым API EWS, если с его помощью получаете вложения из письма. Значения некоторых атрибутов укорочены для удобства чтения.
<?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="Exchange207_SP1" />
</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="ERu/AAA=" />
</m:ItemIds>
</m:GetItem>
</soap:Body>
</soap:Envelope>
В ответ на запрос GetItem сервер отправляет сообщение GetItemResponse, содержащее элемент 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="ERu/AAA="
ChangeKey="CQAAABYAAAAFI5DJmZv+TLtyLOLIF1S5AAAYEMnd" />
<t:Attachments>
<t:FileAttachment>
<t:AttachmentId Id="5zTzlqU=" />
<t:Name>FileAttachment.txt</t:Name>
<t:Size>212</t:Size>
<t:LastModifiedTime>2014-05-14T17:59:30</t:LastModifiedTime>
<t:IsInline>false</t:IsInline>
<t:IsContactPhoto>false</t:IsContactPhoto>
</t:FileAttachment>
<t:ItemAttachment>
<t:AttachmentId Id="Ktum21o=" />
<t:Name>Attached Message Item</t:Name>
<t:Size>3063</t:Size>
<t:LastModifiedTime>2014-05-14T17:59:30</t:LastModifiedTime>
<t:IsInline>false</t:IsInline>
</t:ItemAttachment>
</t:Attachments>
</t:Message>
</m:Items>
</m:GetItemResponseMessage>
</m:ResponseMessages>
</m:GetItemResponse>
</s:Body>
</s:Envelope>
Теперь, когда у вас есть значения AttachmentId, вызовите операцию GetAttachment для всех вложений, которые необходимо извлечь.
<?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" />
</soap:Header>
<soap:Body>
<m:GetAttachment>
<m:AttachmentIds>
<t:AttachmentId Id="5zTzlqU=" />
</m:AttachmentIds>
</m:GetAttachment>
</soap:Body>
</soap:Envelope>
При извлечении только элемента вложения в ответ на запрос GetAttachment сервер отправляет сообщение GetAttachmentResponse, содержащее элемент 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:GetAttachmentResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:GetAttachmentResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Attachments>
<t:ItemAttachment>
<t:AttachmentId Id="Ktum21o=" />
<t:Name>Attached Message Item</t:Name>
<t:Message>
<t:ItemClass>IPM.Note</t:ItemClass>
<t:Subject>Message Item Subject</t:Subject>
<t:Body BodyType="HTML">&lt;meta http-equiv="Content-Type"
content="text/html; charset=utf-8"&gt;Message Item Body</t:Body>
<t:Size>2859</t:Size>
<t:IsSubmitted>false</t:IsSubmitted>
<t:IsDraft>true</t:IsDraft>
<t:IsFromMe>false</t:IsFromMe>
<t:IsResend>false</t:IsResend>
<t:IsUnmodified>false</t:IsUnmodified>
<t:DateTimeCreated>2014-05-14T17:59:37Z</t:DateTimeCreated>
<t:ResponseObjects>
<t:ForwardItem />
</t:ResponseObjects>
<t:DisplayCc />
<t:DisplayTo>primary; emaildelegate</t:DisplayTo>
<t:HasAttachments>false</t:HasAttachments>
<t:Culture>en</t:Culture>
<t:EffectiveRights>
<t:CreateAssociated>false</t:CreateAssociated>
<t:CreateContents>false</t:CreateContents>
<t:CreateHierarchy>false</t:CreateHierarchy>
<t:Delete>true</t:Delete>
<t:Modify>true</t:Modify>
<t:Read>true</t:Read>
</t:EffectiveRights>
<t:LastModifiedName>primary</t:LastModifiedName>
<t:LastModifiedTime>2014-05-14T17:59:30Z</t:LastModifiedTime>
<t:IsAssociated>false</t:IsAssociated>
<t:WebClientReadFormQueryString>?ItemID=AAMk3D&amp;exvsurl=1&amp;viewmodel=
ReadMessageItem</t:WebClientReadFormQueryString>
<t:ConversationId Id="AAQkADIwM2ZlM2ZlLWMwYjctNDg2N/Rc+d0=" />
<t:ToRecipients>
<t:Mailbox>
<t:Name>primary</t:Name>
<t:EmailAddress>sadie@contoso.com</t:EmailAddress>
<t:RoutingType>SMTP</t:RoutingType>
<t:MailboxType>Mailbox</t:MailboxType>
</t:Mailbox>
<t:Mailbox>
<t:Name>emaildelegate</t:Name>
<t:EmailAddress>ronnie@contoso.com</t:EmailAddress>
<t:RoutingType>SMTP</t:RoutingType>
<t:MailboxType>Mailbox</t:MailboxType>
</t:Mailbox>
</t:ToRecipients>
<t:IsReadReceiptRequested>false</t:IsReadReceiptRequested>
<t:ConversationIndex>AQHPb55BxR5Fm0Arx0yY4xbL9Fz53Q==</t:ConversationIndex>
<t:ConversationTopic>Message Item Subject</t:ConversationTopic>
<t:IsRead>true</t:IsRead>
</t:Message>
</t:ItemAttachment>
</m:Attachments>
</m:GetAttachmentResponseMessage>
</m:ResponseMessages>
</m:GetAttachmentResponse>
</s:Body>
</s:Envelope>
При извлечении вложенного файла в ответ на запрос GetAttachment сервер отправляет сообщение GetAttachmentResponse, содержащее элемент 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:GetAttachmentResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:GetAttachmentResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Attachments>
<t:FileAttachment>
<t:AttachmentId Id="5zTzlqU=" />
<t:Name>FileAttachment.txt</t:Name>
<t:Content>VGhpcyBpcyBhIGZpbGUgYXR0YWNobWVudC4=</t:Content>
</t:FileAttachment>
</m:Attachments>
</m:GetAttachmentResponseMessage>
</m:ResponseMessages>
</m:GetAttachmentResponse>
</s:Body>
</s:Envelope>
Сохранение вложенного сообщения электронной почты с помощью управляемого API EWS
Чтобы сохранить содержимое вложения почты с помощью управляемого API EWS, нужно сохранитьMimeContent в файл. При этом будут потеряны все расширенные свойства установленные для элемента. Например, отметки "К исполнению" и категории. Этот пример сохраняет вложение почты в папку C:\temp\.
Обратите внимание, что вам не удастся переместить или скопировать вложение в другую папку, так как элемент вложения не является строго типизированным. Поэтому если нужно переместить вложение в другую папку, используйте приведенный ниже пример кода, а затем импортируйте файл в другую папку.
public static void SaveEmailAttachment(ExchangeService service, ItemId itemId)
{
// Bind to an existing message item and retrieve the attachments collection.
// This method results in an GetItem call to EWS.
EmailMessage message = EmailMessage.Bind(service, itemId, new PropertySet(ItemSchema.Attachments));
foreach (Attachment attachment in message.Attachments)
{
if (attachment is ItemAttachment)
{
ItemAttachment itemAttachment = attachment as ItemAttachment;
itemAttachment.Load(ItemSchema.MimeContent);
string fileName = "C:\\Temp\\" + itemAttachment.Item.Subject + ".eml";
// Write the bytes of the attachment into a file.
File.WriteAllBytes(fileName, itemAttachment.Item.MimeContent.Content);
Console.WriteLine("Email attachment name: "+ itemAttachment.Item.Subject + ".eml");
}
}
}